Answers:
当然,这意味着COUNT(any_non_null_column)
会给出相同的结果COUNT(*)
,因为没有NULL值会引起差异。
通常,COUNT(*)
应该更好,因为可以使用任何索引,因为COUNT(column_or_expression)
可能没有索引或SARGable
从ANSI-92(查找“ Scalar expressions 125
”)
案件:
a)如果指定了COUNT(*),则结果为T的基数。
b)否则,将TX设为单列表,这是对<T的每一行应用<value expression>并消除空值的结果。如果消除了一个或多个空值,则会引发完成条件:警告-设置函数中的空值已消除。
相同的规则至少也适用于SQL Server和Sybase
注意:COUNT(1)与COUNT(*)相同,因为1是不可为空的表达式。
COUNT(*)
,COUNT(<constant>)
并且COUNT(<column name>)
所有三个都可以加ALL
或前缀DISTINCT
(ALL
如果省略则默认为)。我只是想知道您说的地方可以使用什么表达方式_or_expression
?
COUNT(1)
当无用的示例时,与相同COUNT(*)
。COUNT(CASE WHEN a>b THEN 1 END)
例如,计算a> b的行。
在最新版本中,count(*)和count(任何非null列)之间确实没有区别,但重点是not null :-)偶然在博客文章中涉及了该主题:count(col)比count好吗? (*)?
在《Oracle8i认证专家DBA认证考试指南》(ISBN 0072130601)一书中,第78页指出COUNT(1)实际上比COUNT(*)运行得更快,因为调用了某些机制来检查数据字典中每一列的可为空性(或使用COUNT(*)时,至少第一列具有不可空性)。COUNT(1)绕过那些机制。
MySQL欺骗“ tblname上的SELECT COUNT(1);” 通过读取表头以获取表计数来访问MyISAM表。InnoDB每次都会计数。
要测试COUNT(1)是否以与数据库无关的方式比COUNT(*)运行更快,只需运行以下命令并自己判断运行时间:
SELECT COUNT(1) FROM tblname WHERE 1 = 1;
SELECT COUNT(*) FROM tblname WHERE 1 = 1;
SELECT COUNT(column-name) FROM tblname WHERE 1 = 1;
这使得COUNT函数在相同级别的竞争环境中运行,而与存储引擎或RDBMS无关。
count(*)
。