count(*)vs count(column-name) - 哪个更正确?

bre*_*ead 101 sql count

是否有所作为,如果你这样做count(*)VS count(column-name)在这两个例子?

我倾向于总是写作,count(*)因为它似乎更符合我的想法,它是一个集合函数,如果这是有道理的.

但我不确定它是否在技术上最好,因为我倾向于看到没有*经常写的示例代码.

计数(*):

select customerid, count(*), sum(price) 
from items_ordered
group by customerid
having count(*) > 1;
Run Code Online (Sandbox Code Playgroud)

与count(列名):

SELECT customerid, count(customerid), sum(price)
FROM items_ordered
GROUP BY customerid
HAVING count(customerid) > 1;
Run Code Online (Sandbox Code Playgroud)

gbn*_*gbn 135

  • COUNT(*) 统计所有行
  • COUNT(column) 仅计算非NULL
  • COUNT(1)COUNT(*)因为1是非空表达式

您在使用COUNT(*)COUNT(column)应根据所需的输出.

  • 准确地说,COUNT(column) 统计的是column 的值不为NULL 的行,而COUNT(*) 统计的是表中的所有行。 (3认同)
  • 还有性能差异(至少在MySQL中)(参见我的回答). (2认同)

nic*_*ckf 33

这适用于MySQL.我不确定其他人.

不同之处是:

  • COUNT(*) 将计算记录数.
  • COUNT(column_name) 将计算column_name不为null的记录数.

因此COUNT(*),你应该使用.如果您正在使用MyISAM并且没有WHERE子句,那么优化器甚至不必查看该表,因为已经缓存了行数.

  • 所以我知道count(col)比count(*)慢,因为MySQL必须检查行以查看是否为NULL,但是如果列定义为NOT NULL,那么它仍然重要吗? (4认同)

Dea*_*ing 19

当它是一个标识符(并保证是非标识符NULL)时,它可能无关紧要.

但是,有之间的差异COUNT(*),并COUNT(column)在一般情况下,这COUNT(column)将返回非计数NULL列中的值.还有COUNT(DISTINCT column)变量返回唯一的非NULL值的数量.


Tom*_*mmi 5

是的,性能可能存在差异。根据您的查询和相关表的索引,可以更快地从索引中获取计数,而不是直接从表中获取数据。因此,您可能应该指定字段名称,而不要使用*。


zed*_*xff 5

通常它是相同的,但在细节上AFAIK "count(*)"是更好的 b/c"count(columnname)"强制DB执行更多代码来查找该列名称(但不是必需的).

  • 它取决于数据库,Oracle/MSSQL/MySQL/DB2做的不同. (2认同)