【SQL】null对聚合函数的影响

本文探讨了SQL中max、min、sum、avg、count等常用聚合函数如何处理NULL值,以及这些处理方式如何影响查询结果。特别是对于min、avg和count函数,在计算时需要注意NULL值的影响,并提供了解决方案。

我们比较常用的聚合函数,如 max,min,sum,avg,count等,都会忽略null值。

而我们在处理max以及sum时,没有考虑null值,但在处理avg和coun以及mint时就要注意了:

SQL> select max(comm), max(coalesce(comm, 0)) from emp;


 MAX(COMM) MAX(COALESCE(COMM,0))
---------- ---------------------
      1400                  1400

很明显,max在null时即时忽略掉null,也对结果没有什么影响。因为我们认为null就是没有值,在这里表示没有奖金,也就是奖金为0.
SQL> select min(comm), min(coalesce(comm, 0)) from emp;

 MIN(COMM) MIN(COALESCE(COMM,0))
---------- ---------------------
       300                     0

但在min中,null被忽略掉之后就有影响了。比如这里,我们认为最小的奖金应该是那些没有奖金的记录,也就是应该显示为0.

但是min在null时,把null忽略掉了,这就导致如果不提前转换null为0,那么直接min出来的最小奖金其实是错误的。

SQL> select sum(comm),sum(coalesce(comm,0)) from emp;

 SUM(COMM) SUM(COALESCE(COMM,0))
---------- ---------------------
      2200                  2200

同样,sum在处理null时,也对其忽略。但是这同样对sum没有影响。
SQL> select sum(comm),count(comm),count(*),sum(comm)/count(*) from emp;


 SUM(COMM) COUNT(COMM)   COUNT(*) SUM(COMM)/COUNT(*)
---------- ----------- ---------- ------------------
      2200           3         14         157.142857

这里是求得奖金的平均值,计算的公式应该是 奖金的总和除以员工人数(应该包括那些没有奖金的人)。

所以,如果使用count(comm)来求得员工人数是错误的,因为它忽略了奖金为null的人。

SQL> select sum(comm)/count(*),avg(comm),avg(coalesce(comm,0)) from emp;


SUM(COMM)/COUNT(*)  AVG(COMM) AVG(COALESCE(COMM,0))
------------------ ---------- ---------------------
        157.142857 733.333333            157.142857

SQL>

很明显,avg在处理null时,同样忽略了null值。这对求平均值来说是错误的。应该要将null值提前转换为0.


所以,sum和max时可以不考虑null值对结果的影响,但是avg、count和min时必须要注意。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值