MySQL中的sum函数遇到null的坑点

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

这样是完全没必要的。

### MySQLSUM函数的用法 #### 使用SUM函数进行简单聚合计算 在MySQL中,`SUM()` 函数是一个非常实用的聚合函数,主要用于计算某一列数值的总和。对于表中的某列数据,可以直接应用 `SUM()` 来获取该列所有记录值的累加结果[^1]。 ```sql SELECT SUM(column_name) AS total_sum FROM table_name; ``` 这段SQL语句会返回名为 `total_sum` 的单个值,表示来自 `table_name` 表内 `column_name` 列的所有非NULL值相加之和。 #### 带有条件限制的SUM函数使用方法 当需要基于特定条件来求和时,在查询里加入WHERE子句可以实现这一需求。通过这种方式可以在执行求和操作前先筛选符合条件的数据行[^2]。 ```sql SELECT SUM(column_name) AS conditional_total FROM table_name WHERE condition_expression; ``` 这里的 `condition_expression` 是用来定义哪些行应该被纳入到最终求和范围内的逻辑表达式。 #### 结合其他功能增强SUM的应用场景 除了基本的求和外,还可以利用子查询的方式进一步扩展 `SUM()` 功能。例如在一个更复杂的业务场景下,可能要先按某些标准分组再分别统计各部分的小计;或者是在汇总之前做一些预处理工作,像去除异常值等。不过需要注意的是,虽然可以通过组合不同技术手段达到复杂目的,但是按照规定不允许嵌套调用两个不同的聚合函数,即不能写出类似于 `AVG(SUM())` 这样的结构[^4]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值