You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何NULL+0结果为NULL,而SUM(NULL,0)结果为0?

SQL里NULL运算和聚合函数的行为差异为啥不一样?

先搞懂NULL的本质

SQL里的NULL是「未知值」,不是0也不是空字符串。当你执行SELECT NULL + 0 adding;时,未知值加任何确定数,结果还是未知,所以返回NULL——这是标量运算的严格规则:只要参与运算的有NULL,结果就保持“未知”状态,不能随便凑一个确定值出来。

SUM为啥能忽略NULL?

聚合函数(比如SUM)的设计逻辑是聚焦有效数据的统计,SQL标准明确规定:除了COUNT(*)之外,所有聚合函数都会自动跳过NULL值,只对非NULL的行计算。你给的例子里:

WITH t AS (SELECT NULL c UNION ALL SELECT 0) SELECT SUM(t.c) summing FROM t;

表t有两行:一行是NULL(未知),一行是0(确定),SUM只计算那个确定的0,所以结果就是0。

其他聚合函数的一致逻辑

不光SUM,其他聚合函数都遵循“忽略NULL”的规则:

  • AVG():只计算非NULL值的平均,比如AVG(NULL, 0, 2)结果是1,不会把NULL当成0算出0.666
  • MAX()/MIN():从非NULL值里挑选最大/最小值,比如MAX(NULL, 5, 3)返回5,不会因为存在NULL就变成未知
  • COUNT(column):统计非NULL的行数,而COUNT(*)是特例,它统计所有行(包括NULL),因为*代表整行,不管列有没有值

表值函数与NULL的交互逻辑

表值函数的处理逻辑分两种情况:

  • 生成数据的表值函数:如果函数依赖NULL作为输入参数,比如GENERATE_SERIES(NULL, 5)(生成序列的函数),大部分数据库会返回空结果或者报错——起始值都未知,无法生成有效序列
  • 处理数据的表值函数:比如UNNEST(ARRAY[NULL, 1, 2]),会保留NULL元素,但如果后续配合聚合函数,这些NULL还是会被跳过;直接查询的话,NULL行会正常显示

为什么要这么设计?

核心就是实用优先:

  • 标量运算严格保留NULL,是为了避免把“未知”误当成确定值,防止错误扩散——比如计算用户余额时,某条记录缺失数据,总不能直接当成0来计算
  • 聚合函数忽略NULL,符合日常统计需求——统计销售总额时,某条记录漏了数据,不该让整个总和变成“未知”,否则统计就失去了实际意义

内容的提问来源于stack exchange,提问作者William Entriken

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 05:00:29