ORACLE中count(*)和count(2)有什么区别

What is the difference between count(*) and count(2) in ORACLE

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

例如

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

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

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

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

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

它们的意思不同:

  • COUNT(*) 返回计数 .
  • COUNT(<expr>) 计数 non-null .

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

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