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

时间:2010-06-09 06:14:17

标签: sql count

如果您在这两个示例中执行count(*) vs count(column-name)会有所不同吗?

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

但是我不确定它是否在技术上最好,因为我倾向于看到在没有*的情况下编写的示例代码。

计数(*):

select customerid, count(*), sum(price) 
from items_ordered
group by customerid
having count(*) > 1;

VS。计数(列名称):

SELECT customerid, count(customerid), sum(price)
FROM items_ordered
GROUP BY customerid
HAVING count(customerid) > 1;

5 个答案:

答案 0 :(得分:124)

您对COUNT(*)COUNT(column)的使用应仅基于所需的输出

答案 1 :(得分:32)

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

区别在于:

  • COUNT(*)将计算记录数。
  • COUNT(column_name)将计算column_name不为空的记录数。

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

答案 2 :(得分:17)

如果它是一个标识符(并且保证不是NULL)那么它可能无关紧要。

但是, 一般来说只有COUNT(*)COUNT(column)之间存在差异,因为COUNT(column)将返回非NULL的计数列中的值。还有COUNT(DISTINCT column)变体,它返回唯一的非NULL值的数量。

答案 3 :(得分:5)

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

答案 4 :(得分:5)

通常情况相同,但详细说明AFAIK “count(*)”更好 b / c“count(columnname)”强制DB执行更多代码来查找该列名称(但不是必要的。)