1、前言

项目中的SQL脚本中遇到了

select ifnull(sum(字段名),0) from table_name

该类型的写法,目的很明确,就是为了在sum值为null,也能够返回数字0;那问题就来了,

  1. 什么情况下sum的值会为null?
  2. 如果累加的字段名为出现null值时,sum会返回什么呢?
  3. 如果非计数类型的字段进行累加时(比如varchar),会出现什么情况呢?

2、sum值为null

2.1 官方文档

当然先查查一下官方文档(5.7版本),描述如下:
sum用法
官方文档明确说明了,当结果集中没有数据时,那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、结论

  • 三种情况都有了答案,
  1. 结果集为空时,则sum结果为null
  2. 累加字段出现null时,不参与累加计算
  3. 对非计数字段使用sum,返回0而非null

思考:使用sum函数时,会出现返回null的情况,所以我们可以使用IFNULL函数或者COALESCE函数进行包裹,确保返回的数值类型(如前言所示);但是这里我们不需要对sum中的字段再次进行IFNULL的判断,可以认为,sum函数已经很好的处理了统计字段为null的情况,即

select ifnull(sum(ifnull(字段名),0),0) from table_name

这样是完全没必要的。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐