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)区别以及执行效率高低比较
COUNT(*) vs. COUNT(1) vs. COUNT(pk):哪个更好? [复制]