当我们执行select count(*) from table_name
时,它会返回行数。
count(1)
做什么? 1
在这里表示什么?这是否与count(*)
相同(因为它在执行时给出相同的结果)?
答案 0 :(得分:95)
COUNT函数的参数是要为每一行计算的表达式。 COUNT函数返回表达式求值为非空值的行数。 (*是一个未评估的特殊表达式,它只返回行数。)
表达式还有两个额外的修饰符:ALL和DISTINCT。这些确定是否丢弃重复项。由于ALL是默认值,因此您的示例与count(ALL 1)相同,这意味着将保留重复项。
由于表达式“1”的每一行的计算结果为非null,并且由于您没有删除重复项,因此COUNT(1)应始终返回与COUNT(*)相同的数字。
答案 1 :(得分:26)
以下a link有助于回答您的问题。简而言之:
count(*)是正确的写入方式 它和count(1)被优化为 内部计数(*) - 自
a)计算1不为空的行 效率低于
b)计算行数
答案 2 :(得分:17)
oracle中count(*)和count(1)之间的区别?
count(*)表示它将计算所有记录,即每个单元格 BUT
count(1)表示它将添加一个值为1的伪列,并返回所有记录的计数
答案 3 :(得分:8)
这类似于
之间的区别SELECT * FROM table_name and SELECT 1 FROM table_name.
如果你这样做
SELECT 1 FROM table_name
它将为您提供表格中每行的数字1。所以是count(*)
和count(1)
将提供与count(8)
或count(column_name)
答案 4 :(得分:6)
没有区别。
COUNT(1)
基本上只计算每行的常量值1列。正如此处的其他用户所说,它与COUNT(0)
或COUNT(42)
相同。任何非NULL
值都足够了。
http://asktom.oracle.com/pls/asktom/f?p=100:11:2603224624843292::::P11_QUESTION_ID:1156151916789
Oracle优化器显然使用了它中的错误,导致计数受到您选择的列以及它是否在索引中的影响,因此COUNT(1)约定应运而生。
答案 5 :(得分:5)
SELECT COUNT(1) from <table name>
应该与
完全相同SELECT COUNT(*) from <table name>
可能已经或者仍然有某些原因导致它在某些数据库上的性能优于SELECT COUNT(*)
,但我会认为数据库中存在错误。
SELECT COUNT(col_name) from <table name>
然而,具有不同的含义,因为它只计算给定列的非空值的行。
答案 6 :(得分:2)
答案 7 :(得分:2)
你可以这样测试:
create table test1(
id number,
name varchar2(20)
);
insert into test1 values (1,'abc');
insert into test1 values (1,'abc');
select * from test1;
select count(*) from test1;
select count(1) from test1;
select count(ALL 1) from test1;
select count(DISTINCT 1) from test1;
答案 8 :(得分:0)
根据您的要求,有些人报告执行select count(1) from random_table;
的速度比select count(*) from random_table
快。其他人声称他们完全一样。
此link声称2之间的速度差异是由于全表扫描与快速全扫描所致。