NULL值的总和、平均值、最大值、最小值和计数



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

但是,如果其中一个值是NULL,为什么SELECT SUM(quantity) FROM tbl_name不返回NULLMINMAXAVG等也是如此。由于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版本中都是相同的!

相关内容

  • 没有找到相关文章

最新更新