select count(*) 和 select count(any_non_null_column) 有什么区别?

Mar*_*tin 60 null oracle aggregate count

我似乎记得(在 Oracle 上) utteringselect count(*) from any_tableselect count(any_non_null_column) from any_table.

如果有的话,这两个陈述之间有什么区别?

gbn*_*gbn 73

  • COUNT(*) 将包括 NULLS
  • COUNT(column_or_expression) 不会。

这意味着COUNT(any_non_null_column)将给出与COUNT(*)当然相同的结果,因为没有 NULL 值会导致差异。

一般来说,COUNT(*)应该更好,因为任何索引都可以使用,因为COUNT(column_or_expression)可能没有索引或 SARGable

来自ANSI-92(寻找“ Scalar expressions 125”)

案件:

a) 如果指定了 COUNT(*),则结果为 T 的基数。

b) 否则,令 TX 为将 <value expression> 应用于 T 的每一行并消除空值的结果的单列表。如果消除了一个或多个空值,则会引发完成条件:警告- set 函数中消除了空值。

相同的规则至少也适用于 SQL Server 和 Sybase

注意: COUNT(1) 与 COUNT(*) 相同,因为 1 是不可为空的表达式。

  • 只是为了完整性:如果使用 `count(*)`,Oracle 将在索引的非空列上使用索引扫描。 (4认同)
  • @onedaywhen `COUNT(1)` 作为一个无用的例子,它与 `COUNT(*)` 相同。`COUNT(CASE WHEN a&gt;b THEN 1 END)` 作为一个例子,计算 a&gt;b 的行。 (2认同)

Jac*_*las 16

在任何最新的(即8.x+)版本的 Oracle 中,它们都做同样的事情。换句话说,唯一的区别是语义:

select count(*) from any_table
Run Code Online (Sandbox Code Playgroud)

易于阅读且显而易见您正在尝试做的事情,并且

select count(any_non_null_column) from any_table
Run Code Online (Sandbox Code Playgroud)

更难阅读,因为

  1. 它更长
  2. 它不太容易识别
  3. 你必须考虑是否any_non_null_column真的被强制执行为not null

简而言之,使用count(*)


Uwe*_*sse 9

在最近的版本中,count(*) 和 count(任何非空列)之间确实没有区别,重点是not null :-) 偶然用博客文章讨论了该主题:计数(列)比计数更好(*)?