2015-05-11 237 views
2

在MySQL中SELECT 2+NULL FROM tbl_name将返回NULL,因为MySQL无法将NULL解释为数字。总和,平均值,最大值,最小值,空值计数

但为什么SELECT SUM(quantity) FROM tbl_name不返回NULL如果其中一个值是NULLMINMAXAVG等等也是一样。由于MySQL不知道NULL是什么,它不应该为所有指定的函数返回NULL吗?

+0

聚合函数忽略空值'除非另有说明,组函数忽略NULL values' https://dev.mysql.com/doc/refman/5.6/en /组逐功能。html – Mihai

+0

如果存在NULL值,那么这些函数将会失败。在这种情况下,MySQL不会将其解释为零,因为聚合函数将简单地忽略任何NULL。如果那就是你的意思。 – Nidhoegger

回答

3

这是一个很好的问题,并没有一个很好的答案。在你的两个例子中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) 
0

简单,

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版本!

3

根据MySQL Reference,NULL值在集合函数中被忽略。以下是该页面的直接引用:

除非另有说明,否则组函数将忽略NULL值。

相关问题