【问题标题】:What is the difference between count(*) and count(2) in ORACLEORACLE中count(*)和count(2)有什么区别
【发布时间】:2026-02-02 15:15:01
【问题描述】:

我正在查看一些 SQL 代码,并试图找出 oracle 中 count(*) 和 count(2) 之间的区别。

举例

select id_number from person
where type_id = 0010
group by id_number
having count(2) > 1; 
 

【问题讨论】:

标签: sql oracle count having-clause sql-null


【解决方案1】:

两个表达式产生相同的结果。

count(<expr>) 考虑了<expr> 的所有非null 值。 2 是一个文字,非空值,因此所有行都被考虑在内,就像 count(*) 一样。

您也可以使用count(1)count('foo') 或任何其他(非null)文字值来表达这一点。

我更喜欢count(*),因为它在某种程度上更清楚地表明了它的作用:组中的每一行都被计算在内,无论它包含什么值。

【讨论】:

  • 是的:有一种说法是count(1)count(*) 快,因为“count(*) 要求读取每一列”,这是不正确的。 count(*) 在某些情况下甚至不需要读取表本身。
  • @DavidAldridge:是的,很可能任何体面的数据库都会将count(<constant>)优化为count(*)
【解决方案2】:

它们的含义不同:

  • COUNT(*) 返回的计数
  • COUNT(<expr>) 计算非空

在这种情况下,您使用的是COUNT(2),其中表达式始终不为空。因此,它会产生与计算行数相同的值。

理论上计算行数可能会稍微快一些,因为必须将数据视为存在,但不需要真正检查。因此,在计算行数时,引擎不需要具体化列值来评估表达式,而只需要处理指针。

【讨论】: