在MySQL SELECT 2+NULL FROM tbl_name
中将返回NULL
,因为MySQL无法将NULL
解释为数字。
但是,如果其中一个值为SELECT SUM(quantity) FROM tbl_name
,为什么NULL
不会返回NULL
?同样适用于MIN
,MAX
,AVG
等。由于MySQL不知道NULL可能是什么,它不应该为所有指定的函数返回NULL吗?
答案 0 :(得分:3)
根据MySQL Reference,在聚合函数中忽略NULL值。以下是该页面的直接引用:
除非另有说明,否则组函数会忽略NULL值。
答案 1 :(得分:3)
这是一个很好的问题,而且答案不是很好。在你的两个例子中对NULL
的处理是不同的。
根本问题是NULL
的含义。通常,它用于表示缺少值。但是,在ANSI标准中,它代表未知值。我确信哲学家们可以将大部分作品用于“失踪”之间的区别。和"未知"。
在一个简单的表达式(布尔或算术或另一种算术的标量)中,ANSI定义了"未知"的结果。在几乎所有操作数都是"未知"的情况下。有一些例外:NULL AND FALSE
为false且NULL IS NULL
为真,但这些很少见。
对于聚合操作,将SUM()
视为"将所有已知值和#34;相加,依此类推。 SUM()
将NULL
值视为与+
不同。但是,这种行为也是标准的,所以这就是所有数据库的工作方式。
当其操作数的任何为NULL
时,如果您想要聚合的NULL
值,则需要使用CASE
。我认为单列的最简单方法是:
(CASE WHEN COUNT(col) = COUNT(*) THEN SUM(COL) END)
答案 2 :(得分:1)
简单来说,
2 + NULL
,可能仅处理一行 ...
其中_ SUM( 2 and NULL )
将与 2个不同的行。因此,在您分组时,NULL
被忽略了!只有同一行的null所发生的事情才会再次解析为NULL。
所以
COUNT(NULL,1) = 1 (not 2) MAX(NULL,1) = 1 MIN(NULL,1) = 1 AVG(NULL,1) = 1 (not .5)
大多数DBMS版本中的行为都是一样的!