Sum,Avg,Max,Min,NULL值的计数

时间:2015-05-11 18:33:33

标签: mysql sql null sum

在MySQL SELECT 2+NULL FROM tbl_name中将返回NULL,因为MySQL无法将NULL解释为数字。

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

3 个答案:

答案 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版本中的行为都是一样的!