Mysql 为什么加法需要检查null,而求和不需要检查null?

Mysql 为什么加法需要检查null,而求和不需要检查null?,mysql,sql,oracle,Mysql,Sql,Oracle,从中选择sum(a) 有时求和时,我们不需要检查空值,但在加法中我们需要检查,谁能告诉我为什么?范例 我们不需要检查空值 select sum(a) from ( select 1 a, null b from dual union select null, 1 b from dual ) 但是我们需要检查加法,如果我们不检查它将为空 select sum(nvl(a,0) + nvl(b,0)) from ( select 1 a, null b from dual union sel

从中选择sum(a) 有时求和时,我们不需要检查空值,但在加法中我们需要检查,谁能告诉我为什么?范例

我们不需要检查空值

select sum(a) from
(
select 1 a, null b from dual union 
select null, 1 b from dual
)
但是我们需要检查加法,如果我们不检查它将为空

select sum(nvl(a,0) + nvl(b,0)) from 
(
select 1 a, null b from dual union 
select null, 1 b from dual
)

通常,
null
通过
A+B
等表达式传播

例外情况包括聚合函数,它通常在进行聚合之前删除
null

这意味着

SUM(a)

只是在

中不考虑行< <代码> A为null < /代码>的行。
SUM(a + b)
将丢弃
a为null
b为null
的行(因为
a+b
null
,如果其中任何一个为
null

编辑为什么会这样


因为
null
表示缺少数据。无法计算对缺失数据进行操作的表达式,并再次导致缺失数据。聚合是明显的例外:即使缺少一些数据,也可以执行聚合。

我将推测,在聚合函数具有默认行为的情况下,忽略
NULL
值在大多数情况下与所需行为一致

考虑Oracle、MySQL或大多数其他数据库中的平均函数
AVG
。假设我们有一列值,其中也包含一些空值。通过让
AVG
忽略空值,我们得到了相同的结果,就好像我们用所有非
NULL
值的平均值替换了那些空值一样。当几个数据点未知时,这将是统计学家用来报告平均值的常用方法。所以从统计学的角度来看,忽略空值是有意义的,至少在这个非常常见的场景中是这样

另一方面,在基本算术的情况下,对空值进行这样的假设不会得到很好的认可。考虑<代码> a+b+c>代码>,其中任何列可能是“代码> null < /代码>。假设
NULL
代表什么可能是危险和误导的,并可能导致DBA得出结论,认为表达式的值是已知的,而实际上它是未知的。在这种情况下,我们仍然可以忽略空值或替换它们,并且存在
COALESCE
函数(或类似的函数),但它必须手动使用。

只需从中添加:

除COUNT(*)、GROUPING和GROUPING\u ID之外的所有聚合函数 忽略空值。您可以在参数中使用NVL函数 聚合函数以将值替换为null。计数和 REGR_COUNT从不返回null,而是返回数字或零。对于 所有剩余的聚合函数,如果数据集不包含 行,或仅包含以Null作为聚合参数的行 函数,则该函数返回null


忽略聚合函数(如SUM)中的空值是一件好事,应该是预期的行为。

您使用的是MySQL还是Oracle?(不要给未涉及的产品贴标签。)只需做
sum(a)+sum(b)
。可能是重复的,但为什么会这样?我想OP已经知道你发布了什么。我想说聚合只是为了方便起见的例外-从逻辑上讲,sum(unknown)应该=unknown。@JeffreyKemp
sum(null)
null
。但只要有一个not
null
值,聚合就会返回一个非null值。@MarkusWinand,我说过应该,不会。1+未知=未知,因此sum(1,未知)“在理想世界中应该是未知的,而不是1”。@JeffreyKemp SQL没有说“涉及
null
的所有内容都是
null
”,但“由于
null
而无法确定的所有内容都是
null
”。如果您不喜欢这种推理,那么这是另一个问题:)聚合函数通常用于大型数据集,执行最小值、最大值、平均值、秩、方差、某些统计功能等。当一个空值将事情搞砸时,它会很快变得恼人。此外,如果null表示“我不知道”,那么对于大多数聚合,将null默认为0这样的值是没有意义的(4,4,null,null的平均值应该是4,而不是2)。