Oracle中count(*)与count(2)的区别是什么?附SQL示例
Oracle中count(*)与count(2)的区别解析
嘿,这个问题其实不少刚接触Oracle的朋友都会碰到,我来给你讲得明明白白~
首先得先搞懂count()函数的核心逻辑:它本质是统计非空值的数量,不同参数的差异,全看这个参数会不会产生null值。
1. count(*)的作用
count(*)是Oracle里专门用来统计结果集所有行数的写法——不管你的行里有没有null值,哪怕整行所有列都是null,它也会把这一行算进去。简单说就是“数总共有多少行”。
2. count(2)的本质
这里的2是一个常量值,对于结果集里的每一行,这个常量都不会是null(毕竟2就是2,不会变空)。所以count(2)会对每一行都计数,效果和count(*)完全一模一样!
你换成count(1)、count('随便写个非空字符串'),结果也和count(*)没区别,因为这些都是非空常量,每一行都会返回这个值,count函数就会把每一行都统计进去。
结合你的SQL例子来看
你写的这段SQL:
select id_number from person where type_id = 0010 group by id_number having count(2) > 1;
这里用count(2)和换成count(*)运行结果完全相同,都是找出type_id=0010的记录里,重复出现的id_number(也就是同一个id_number对应多行数据的情况)。
额外提醒:和count(列名)的区别
这里要注意别把count(*)/count(常量)和count(列名)搞混:比如count(id_number)是统计id_number列不为null的行数,如果某行的id_number是null,那这一行不会被统计进去,这和前两者的逻辑完全不同。
关于性能的小误区
以前有人觉得count(*)会比count(1)/count(2)慢,但实际上Oracle的优化器会把这些写法当成完全等价的操作,执行计划和性能没有任何差别,选哪种全看个人习惯~
内容的提问来源于stack exchange,提问作者Mariana




