在MySQL中SELECT 2+NULL FROM tbl_name
将返回NULL
,因为MySQL无法将NULL
解释为数字。总和,平均值,最大值,最小值,空值计数
但为什么SELECT SUM(quantity) FROM tbl_name
不返回NULL
如果其中一个值是NULL
? MIN
,MAX
,AVG
等等也是一样。由于MySQL不知道NULL是什么,它不应该为所有指定的函数返回NULL吗?
在MySQL中SELECT 2+NULL FROM tbl_name
将返回NULL
,因为MySQL无法将NULL
解释为数字。总和,平均值,最大值,最小值,空值计数
但为什么SELECT SUM(quantity) FROM tbl_name
不返回NULL
如果其中一个值是NULL
? MIN
,MAX
,AVG
等等也是一样。由于MySQL不知道NULL是什么,它不应该为所有指定的函数返回NULL吗?
这是一个很好的问题,并没有一个很好的答案。在你的两个例子中NULL
的处理是不同的。
基本问题是NULL
的含义。通常,它用于表示缺少值。但是,在ANSI标准中,它代表未知的值。我敢肯定,哲学家可以致力于“失踪”与“未知”之间的区别。
在一个简单的表达式(布尔或算术或其他类型的标量)中,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
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值在集合函数中被忽略。以下是该页面的直接引用:
除非另有说明,否则组函数将忽略NULL值。
聚合函数忽略空值'除非另有说明,组函数忽略NULL values' https://dev.mysql.com/doc/refman/5.6/en /组逐功能。html – Mihai
如果存在NULL值,那么这些函数将会失败。在这种情况下,MySQL不会将其解释为零,因为聚合函数将简单地忽略任何NULL。如果那就是你的意思。 – Nidhoegger