在MySQL中,SELECT 2+NULL FROM tbl_name
将返回NULL
,因为MySQL无法将NULL
解释为数字。
但是,如果其中一个值是NULL
,为什么SELECT SUM(quantity) FROM tbl_name
不返回NULL
?MIN
、MAX
、AVG
等也是如此。由于MySQL不知道NULL可能是什么,它不应该为所有指定的函数返回NULL吗?
根据MySQL参考,在聚合函数中忽略NULL值。这是页面上的直接报价:
除非另有说明,否则组函数将忽略NULL值。
这是一个很好的问题,但没有一个好的答案。你的两个例子对NULL
的处理是不同的。
根本问题是NULL
的含义。通常,它用于表示缺少值。但是,在ANSI标准中,它代表未知的值。我相信哲学家们可以用大部头来研究"失踪"one_answers"未知"之间的区别。
在一个简单的表达式(布尔表达式、算术表达式或其他类型的标量表达式)中,ANSI在几乎所有操作数为"未知"的情况下都定义了"未知"结果。也有一些例外:NULL AND FALSE
为假,NULL IS NULL
为真,但这些都很少见。
对于聚合操作,可以将SUM()
视为"对所有已知值求和",依此类推。SUM()
对待NULL
的值与对待+
的值不同。但是,这种行为也是标准的,所以所有数据库都是这样工作的。
如果在其任何操作数为NULL
时,需要为聚合使用NULL
值,则需要使用CASE
。我认为单栏最简单的方法是:
(CASE WHEN COUNT(col) = COUNT(*) THEN SUM(COL) END)
简单地说,
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版本中都是相同的!