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 NULL
? MIN
、MAX
、AVG
等也是如此。由于 MySQL 不知道 NULL 可能是什么,所以 return NULL 不应该是所有指定的功能?
简单来说,
2 + NULL
,可能只处理 一行...
其中 SUM( 2 and NULL )
将有 2 个不同的行 。因此,在分组时 NULL
s 会被忽略!仅同一行的 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
值,当其操作数的 any 是 NULL
时,您需要使用 CASE
.我认为单列最简单的方法是:
(CASE WHEN COUNT(col) = COUNT(*) THEN SUM(COL) END)
在 MySQL SELECT 2+NULL FROM tbl_name
中将 return NULL
,因为 MySQL 无法将 NULL
解释为数字。
但是,如果只有一个值是 NULL
,为什么 SELECT SUM(quantity) FROM tbl_name
而不是 return NULL
? MIN
、MAX
、AVG
等也是如此。由于 MySQL 不知道 NULL 可能是什么,所以 return NULL 不应该是所有指定的功能?
简单来说,
2 + NULL
,可能只处理 一行...
其中 SUM( 2 and NULL )
将有 2 个不同的行 。因此,在分组时 NULL
s 会被忽略!仅同一行的 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
值,当其操作数的 any 是 NULL
时,您需要使用 CASE
.我认为单列最简单的方法是:
(CASE WHEN COUNT(col) = COUNT(*) THEN SUM(COL) END)