计数(*)与计数(列名) – 哪个更正确?
在这两个例子中, 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“计数(列名)”强制数据库执行多一点代码来查找该列名称(但不是必要的,但)。
是的,性能可能有所不同。 根据您的查询以及所涉及表的索引,从索引获取计数可能会更快,而不是转到数据表。 因此,你可能应该指定字段名称,而不是使用*。