问题描述
我正在查看一些sql代码,并试图找出oracle中count(*)和count(2)有什么区别。
例如
select id_number from person
where type_id = 0010
group by id_number
having count(2) > 1;
解决方法
两个表达式产生相同的结果。
count(<expr>)
考虑了null
的所有非<expr>
值。 2
是文字非空值,因此像count(*)
一样考虑所有行。
您也可以使用count(1)
,count('foo')
或任何其他(非null
)文字值来表示这一点。
我更喜欢count(*)
,因为它在某种程度上更加清楚:无论该行包含什么值,都对组中的每一行进行计数。
它们的含义有所不同:
-
COUNT(*)
返回的计数行。 -
COUNT(<expr>)
计算非空的值。
在这种情况下,您使用的COUNT(2)
表达式始终不为null。因此,它将产生与计数行相同的值。
从理论上讲,对行进行计数的速度可能会稍快一些,因为必须对数据进行计数,但实际上并不需要进行检查。因此,在对行进行计数时,引擎无需物化以计算表达式的列值,而只需要处理指针即可。