You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动