count(*) vs count(column-name) - 哪个更正确? [复制]

Posted

技术标签:

【中文标题】count(*) vs count(column-name) - 哪个更正确? [复制]【英文标题】:count(*) vs count(column-name) - which is more correct? [duplicate] 【发布时间】:2011-03-01 12:20:39 【问题描述】:

如果你像这两个例子一样使用count(*)count(column-name) 会有什么不同吗?

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

但我不确定它是否在技术上是最好的,因为我经常看到不使用* 编写的示例代码。

count(*):

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

对比计数(列名):

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

【问题讨论】:

嘟嘟嘟***.com/questions/59294/… 【参考方案1】: COUNT(*) 统计所有行 COUNT(column) 只计算非空值 COUNT(1) is the same as COUNT(*) 因为 1 是非空表达式

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

【讨论】:

也存在性能差异(至少在 mysql 中)(见我的回答)。 准确来说,COUNT(column) 统计column 值不为NULL 的行,而COUNT(*) 统计表中的所有行。【参考方案2】:

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

区别在于:

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

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

【讨论】:

所以我知道 count(col) 比 count(*) 慢,因为 MySQL 必须检查行以查看是否为 NULL,但如果列定义为 NOT NULL,那么它仍然重要吗? count( col ) 其中 col 是主索引列怎么样?我认为索引有助于更快地完成任务? @Stphane 在这种情况下它将使用索引。【参考方案3】:

当它是一个标识符(并且保证不是NULL)时,它可能无关紧要。

但是,COUNT(*)COUNT(column) 之间通常存在差异,COUNT(column) 将返回列中非NULL 值的计数。还有一个COUNT(DISTINCT column) 变体,它返回唯一的、非NULL 值的数量。

【讨论】:

【参考方案4】:

通常是相同的,但在细节上 AFAIK "count(*)" 更好 b/c "count(columnname)" 强制 DB 执行更多代码来查找该列名称(但不是必须的)。

【讨论】:

这取决于数据库,Oracle/MSSQL/MySQL/DB2 做的不同。【参考方案5】:

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

【讨论】:

以上是关于count(*) vs count(column-name) - 哪个更正确? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

count(*)count和count(column)区别以及执行效率高低比较

html中Column-count属性遇到的问题。求解达

COUNT(*) vs. COUNT(1) vs. COUNT(pk):哪个更好? [复制]

count(*)countcount(column)的区别

“SELECT COUNT(column)”是不是比“SELECT COUNT(*)”快/慢? [复制]

多列布局——column-count