细数sum遇到null的各种情况
1、前言
项目中的SQL脚本中遇到了
select ifnull(sum(字段名),0) from table_name
该类型的写法,目的很明确,就是为了在sum值为null,也能够返回数字0;那问题就来了,
- 什么情况下sum的值会为null?
- 如果累加的字段名为出现null值时,sum会返回什么呢?
- 如果非计数类型的字段进行累加时(比如varchar),会出现什么情况呢?
2、sum值为null
2.1 官方文档
当然先查查一下官方文档(5.7版本),描述如下:
官方文档明确说明了,当结果集中没有数据时,那sum的值为则返回null;
这是官方说法,我们当然也可以自己验证一下;
2.2 本地演示
本地演示数据
- 表结构
- 表数据:
- 测试语句和结果
- 结论一:结果集为空时,则sum结果为null
3、字段值为null时,sum的值
3.1 本地演示
表结构和表数据如上所示
- 测试语句和结果
因为id=2的num值为null,所以sum时,只是累计id=1和3的值,即不参与sum运算 - 结论二:累加字段出现null时,不参与累加计算
注意:上述样例中的结果集为三条,,第二条只是为null不参与计算,但不代表不算在结果集内,即如果只统计id=2的结果,sum值也会为null,但是不是官网文档说的null值情况
4、对非计数类型使用sum函数
4.1 本地演示
表结构和表数据如上所示
- 测试语句和结果
对姓名使用sum函数进行累加计数,SQL不会报错,返回值为0 - 结论三:对非计数字段使用sum,返回0而非null
5、结论
- 三种情况都有了答案,
- 结果集为空时,则sum结果为null
- 累加字段出现null时,不参与累加计算
- 对非计数字段使用sum,返回0而非null
思考:使用sum函数时,会出现返回null的情况,所以我们可以使用IFNULL函数或者COALESCE函数进行包裹,确保返回的数值类型(如前言所示);但是这里我们不需要对sum中的字段再次进行IFNULL的判断,可以认为,sum函数已经很好的处理了统计字段为null的情况,即
select ifnull(sum(ifnull(字段名),0),0) from table_name
这样是完全没必要的。