在SQL中,count(*)和count(‘x’)有什么区别?

在SQL中,count(*)和count(‘x’)有什么区别?

In SQL, what’s the difference between count(*) and count('x')?

本问题已经有最佳答案,请猛点这里访问。

我有以下代码:

1
2
3
SELECT <column>, COUNT(*)
FROM <table>
GROUP BY <column> HAVING COUNT(*) > 1;

如果我将COUNT(*)替换为COUNT('x'),结果或性能会有所不同吗?

(此问题与上一个问题有关)


SELECT COUNT(*) vs COUNT(1)会导致DBMS返回"列",这纯属糊涂。可能很久以前就是这种情况,但是任何自重的查询优化器都会选择一些快速方法来对表中的行进行计数-SELECT COUNT(*), COUNT(1), COUNT('this is a silly conversation')之间没有性能差异

此外,SELECT(1) vs SELECT(*)在INDEX用法上没有任何区别-多数DBMS都会实际上对SELECT( n ) into SELECT(*)进行优化。请参阅ASK TOM:十年来,Oracle一直在优化SELECT(n) into SELECT(*),即使不是更长的时间:
http://asktom.oracle.com/pls/asktom/f?p=100:11:0:::::P11_QUESTION_ID:1156151916789

problem is in count(col) to count()
conversion
**03/23/00 05:46 pm *** one workaround is to set event 10122 to
turn off count(col) ->count()
optimization. Another work around is
to change the count(col) to count(),
it means the same, when the col has a
NOT NULL constraint. The bug number is
1215372.

需要注意的一件事-如果您正在使用COUNT(col)(不要!)并且col被标记为NULL,那么它实际上将必须计算表中的出现次数(通过索引扫描,直方图等)它们是否存在,否则进行全表扫描)。

底线:如果您想要的是表中的行数,请使用COUNT(*)


这个问题与另一个提到的问题略有不同。在所引用的问题中,有人问到使用count(*)和count(SomeColumnName)有什么区别,SQLMenace的答案很明确。

为了解决这个问题,结果基本上没有区别。 count(*)和count('x')都说count(1)将返回相同的数字。区别在于,当使用" *"时,就像在SELECT中一样,将返回所有列,然后进行计数。当使用常数(例如'x'或1)时,会传回具有一栏的资料列,然后再进行计数。当" *"返回许多列时,将看到性能差异。

更新:上面关于性能的陈述可能不像其他答案中所讨论的那样正确,但是在使用EXISTS和NOT EXISTS时确实适用于子选择查询


主要的性能差异是可以通过检查表上的主键来满足COUNT(*)。

也就是说,在下面的简单情况下,查询将立即返回,而无需检查任何行。

1
SELECT COUNT(*) FROM TABLE

我不确定SQL Server中的查询优化器是否会这样做,但是在上面的示例中,如果您要分组的列具有索引,则服务器应该能够满足查询而根本不击中实际表。

需要说明的是:此答案专门针对SQL Server。我不知道其他DBMS产品如何处理此问题。


MySQL:根据MySQL网站,对于使用MyISAM的单表查询,COUNT(*)更快:

http://dev.mysql.com/doc/refman/5.0/zh/group-by-functions.html#function_count

我猜一个带有计数的hading子句可能会改变事情。


推荐阅读