当我们执行 select count(*) from table_name
时,它会返回行数。
count(1)
做什么?这里的1
代表什么?它与 count(*)
相同吗(因为它在执行时给出了相同的结果)?
COUNT(1)
这个令人困惑的语法。现在...如果 "COUNT(1) 应该总是返回与 COUNT() 相同的数字"*, 那么为什么有两种语法形式,只有一个字符不同,却完全相同呢? - datpsCOUNT(*)
中使用 DISTINCT。但是你可以使用 SELECT COUNT(DISTINCT 1)...WHERE id=...
,它会返回 0
或 1
(取决于记录是否存在),这比 COUNT(*)
更容易转换为布尔值。 - Caltor这里有一个链接可以帮助回答您的问题。简而言之:
使用count(*)是正确的写法,count(1)在内部被优化为count(*) -- 因为
a) 计算where 1不为空的行数比
b) 计算所有行数效率更低
SELECT * FROM table_name and SELECT 1 FROM table_name.
如果您执行
SELECT 1 FROM table_name
对于表中的每一行,count(*)
和 count(1)
都会给出数字 1。因此,和 count(8)
或者 count(column_name)
相比,它们将提供相同的结果。
没有区别。
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)的惯例。
SELECT COUNT(1) from <table name>
SELECT COUNT(*) from <table name>
可能有一些原因,导致它在某些数据库上的表现比SELECT COUNT(*)
更好,但我认为这是数据库中的一个错误。
SELECT COUNT(col_name) from <table name>
然而,它有不同的含义,因为它仅计算具有给定列的非空值的行。
您可以这样测试:
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;
根据不同的人所说,有些人报告称执行 select count(1) from random_table;
比 select count(*) from random_table
运行得更快。其他人则声称它们完全相同。
这个 link 声称两者之间的速度差异是由于 FULL TABLE SCAN 和 FAST FULL SCAN 的原因。