NULL 值的总和、平均值、最大值、最小值、计数

Sum, Avg, Max, Min, Count of NULL values

在 MySQL SELECT 2+NULL FROM tbl_name 中将 return NULL,因为 MySQL 无法将 NULL 解释为数字。

但是,如果只有一个值是 NULL,为什么 SELECT SUM(quantity) FROM tbl_name 而不是 return NULLMINMAXAVG 等也是如此。由于 MySQL 不知道 NULL 可能是什么,所以 return NULL 不应该是所有指定的功能?

简单来说,

2 + NULL,可能只处理 一行...

其中 SUM( 2 and NULL ) 将有 2 个不同的行 。因此,在分组时 NULLs 会被忽略!仅同一行的 null 发生的情况将再次解析为 NULL。

所以

COUNT(NULL,1) = 1 (not 2)
MAX(NULL,1) = 1
MIN(NULL,1) = 1
AVG(NULL,1) = 1 (not .5)

此行为在大多数 DBMS 版本中都是相同的!

根据 MySQL Reference,聚合函数中忽略 NULL 值。这是页面的直接引用:

Unless otherwise stated, group functions ignore NULL values.

这是一个很好的问题,但没有很好的答案。你的两个例子中 NULL 的处理方式不同。

根本问题是NULL是什么意思。通常,它用于表示 缺失 值。但是,在 ANSI 标准中,它代表 unknown 值。我敢肯定,哲学家们可以专门研究 "missing" 和 "unknown" 之间的区别。

在一个简单的表达式(布尔或算术或另一种标量)中,ANSI 在几乎所有操作数为 "unknown" 的情况下定义 "unknown" 的结果。有一些例外:NULL AND FALSE 为假,NULL IS NULL 为真,但这些情况很少见。

对于聚合操作,将 SUM() 视为 "sum all the known values",依此类推。 SUM() 对待 NULL 值的方式与 + 不同。但是,这种行为也是标准的,所以这就是所有数据库的工作方式。

如果您想要聚合的 NULL 值,当其操作数的 anyNULL 时,您需要使用 CASE .我认为单列最简单的方法是:

(CASE WHEN COUNT(col) = COUNT(*) THEN SUM(COL) END)