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

1885

被折叠的 条评论
为什么被折叠?



