oracle 使用count()函数进行分组计数时所踩的坑!count(0),count(1),count(*)和count(列名)的区别
1.情景展示
需要对id_card字段按字符长度进行分组统计并进行计数。
2.错误方式
第一步:统计出id_card字段共存在几种情况。
第一种方式:distinct
第二种方式:group by
第二步:分组计数
计数只能通过group by来实现。
问题就在于:
当id_card字段内容为空(null)时,这个地方计数实际是错误的!
因为count()函数自动将字段id_card的为null的值去掉了!而实际需要将该字段为空的行数据也统计在内。
示例
3.解决方案
使用count(1)解决。
说明:
count(1)和count(*),count(0),这两个函数计数的时候,都会将null统计在内,也包括重复记录;
count(字段名) ,这个函数会自动将该字段值为null的记录排除在外,也包括重复记录。
count(主键列),查询速度最快,主键列值不可能为空,计数就不会出错。
2024年4月24日17:05:08
补充说明:
2021年9月27日16:32:48
4.扩展
现有一组数据,字段名称为:isupload,其值至少有3种情况,分别为:1,2,空和可能为其它值;
现在需要将不是1且不是2的内容筛选出来,我们第一时间想到的SQL是酱紫的:
select count (1) from table_name where isupload <> 1 and isupload <> 2;
查询结果,和总数匹配对不上;
select count (1) from table_name; select count (1) from table_name where isupload = 1; select count (1) from table_name where isupload = 2;
经排查,发现:第一个SQL语句将字段值为null的数据排除在外了。
select count (1) c from table_name where isupload <> 1 and isupload <> 2 union all select count (1) c from table_name where isupload is null ;
这样,才是字段值既不为1,也不为2的数据。
进行数值比较不等于时,如果该字段值为null,则,查询结果不包含该字段为null所在行数据(这是不对的,我们还得将结果为null的也查出来)。
2024年3月20日10:38:07
如果是用not in()来实现,同样不会统计isupload字段值为null的数据。
select count (1) from table_name where isupload not in(1, 2)
union all
select count (1) from table_name where isupload is null;
使用not exists()来实现。
SELECT COUNT(1)
FROM TABLE_NAME T
WHERE NOT EXISTS (SELECT 1
FROM TABLE_NAME T2
WHERE T2.ISUPLOAD IN (1, 2)
AND T2.ISUPLOAD = T.ISUPLOAD);
写在最后
哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!
相关推荐:
本文来自博客园,作者:Marydon,转载请注明原文链接:https://www.cnblogs.com/Marydon20170307/p/10978158.html