计数(*)与计数(列名) – 哪个更正确?

在这两个例子中, 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; 
  • COUNT(*)统计所有行
  • COUNT(column)只计数非NULL
  • COUNT(1)COUNT(*)相同,因为1是非空的expression式

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

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

区别在于:

  • COUNT(*)会计算logging的数量。
  • COUNT(column_name)将计算column_name不为null的logging数。

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

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

但是, COUNT(*)COUNT(column)之间的区别通常在于, COUNT(column)将返回COUNT(column)中非NULL值的计数。 还有COUNT(DISTINCT column)变体,它返回唯一的非NULL值的数量。

一般来说,它是相同的,但在详细信息AFAIK “count(*)”是更好的 B / C“计数(列名)”强制数据库执行多一点代码来查找该列名称(但不是必要的,但)。

是的,性能可能有所不同。 根据您的查询以及所涉及表的索引,从索引获取计数可能会更快,而不是转到数据表。 因此,你可能应该指定字段名称,而不是使用*。