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)
,其中表达式始终不为空。因此,它会产生与计算行数相同的值。
理论上,对行进行计数可能会稍微快一些,因为数据必须计为存在,但实际上不需要检查 .因此,在计算行数时,引擎不需要 具体化 列值来计算表达式,而只需要处理指针。
我正在查看一些 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)
,其中表达式始终不为空。因此,它会产生与计算行数相同的值。
理论上,对行进行计数可能会稍微快一些,因为数据必须计为存在,但实际上不需要检查 .因此,在计算行数时,引擎不需要 具体化 列值来计算表达式,而只需要处理指针。