如果您在这两个示例中执行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;
答案 0 :(得分:124)
COUNT(*)
统计所有行COUNT(column)
仅计算非NULL值COUNT(1)
is the same as COUNT(*)
因为1是非空表达式您对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执行更多代码来查找该列名称(但不是必要的。)