【问题标题】:Sum, Avg, Max, Min, Count of NULL valuesSum、Avg、Max、Min、NULL 值的计数
【发布时间】:2015-05-11 18:33:32
【问题描述】:

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

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

【问题讨论】:

  • 聚合函数忽略 NULL 值 Unless otherwise stated, group functions ignore NULL values dev.mysql.com/doc/refman/5.6/en/group-by-functions.html
  • 如果有 NULL 值,这些函数会失败,这将是非常无用的。在这种情况下,MySQL 不会将其解释为零,因为聚合函数将简单地忽略任何 NULL。如果这就是你的意思。

标签: mysql sql null sum


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    这是一个很好的问题,但没有一个很好的答案。在您的两个示例中,NULL 的处理方式是不同的。

    根本问题是NULL 的含义。通常,它用于表示缺失值。但是,在 ANSI 标准中,它代表 unknown 值。我敢肯定,哲学家可以用大部头来区分“失踪”和“未知”。

    在一个简单的表达式(布尔或算术或另一种标量)中,ANSI 定义了几乎所有操作数为“未知”的情况下的“未知”结果。有一些例外:NULL AND FALSE 为假,NULL IS NULL 为真,但这些情况很少见。

    对于聚合操作,将SUM() 视为“对所有已知值求和”,依此类推。 SUM() 对待 NULL 的值与 + 不同。但是,这种行为也是标准的,因此所有数据库都是这样工作的。

    如果您想要一个聚合的NULL 值,而任何 操作数是NULL,那么您需要使用CASE。我认为单列最简单的方法是:

    (CASE WHEN COUNT(col) = COUNT(*) THEN SUM(COL) END)
    

    【讨论】:

      【解决方案3】:

      简单来说,

      2 + NULL,可能只处理一行...

      Where-as SUM( 2 and NULL ) 将包含 2 个不同的行。因此,NULLs 在您分组时会被忽略!只有同一行的 null 会再次被解析为 NULL。

      所以

      COUNT(NULL,1) = 1 (not 2)
      MAX(NULL,1) = 1
      MIN(NULL,1) = 1
      AVG(NULL,1) = 1 (not .5)
      

      这种行为在大多数 DBMS 版本中都是相同的!

      【讨论】:

        猜你喜欢
        • 2023-03-13
        • 2019-01-07
        • 1970-01-01
        • 2015-12-03
        • 1970-01-01
        • 2013-01-05
        • 1970-01-01
        • 1970-01-01
        • 2015-09-03
        相关资源
        最近更新 更多