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

如果你像这两个例子中那样做 count(*)count(column-name),会有什么不同吗?

我倾向于总是编写 count(*),因为它似乎更适合我的头脑,它是一个聚合函数的概念,如果这是有意义的。

但我不确定这是否是最好的技术,因为我经常看到没有 *编写的示例代码。

统计数字(*) :

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

Vs. count (列名) :

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

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

一般情况下是相同的,但是在细节上 AFAIK “ count (*)”更好 b/c“ count (column nname)”迫使 DB 执行更多的代码来查找该列名(但是没有必要)。

这适用于 MySQL,其他的我就不知道了。

区别在于:

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

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

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

然而,在 COUNT(*)COUNT(column)之间,一般是不同的,因为 COUNT(column)将返回列中非 NULL值的计数。还有一个 COUNT(DISTINCT column)变体,它返回唯一的、非 NULL值的个数。

  • COUNT(*)计算所有行
  • COUNT(column)只计算非空值
  • COUNT(1)COUNT(*) 相同,因为1是非空表达式

使用 COUNT(*)COUNT(column)应该基于所需的输出 只有