【问题标题】:NULL value count in group by组中的 NULL 值计数
【发布时间】:2017-09-29 16:46:31
【问题描述】:

为了简单起见,我将使用简单的表格属性(意味着表格更大)来演示问题:

我有下表测试:

 id | nbr
----+-----
  1 |   0
  2 |
  3 |
  4 |   1
  5 |   1
 (5 rows)

id 和 nbr 都是数值

以下查询

select nbr, count(nbr) from test group by nbr;

输出:

 nbr | count
-----+-------
     |     0
   1 |     2
   0 |     1
(3 rows)

而查询:

select nbr, count(*) from test group by nbr;

输出:

 nbr | count
-----+------
     |     2
   1 |     2
   0 |     1
 (3 rows)

我发现很难解释 count(nbr) 和 count(*) 关于 null 值的区别 谁能像我五岁一样向我解释一下,谢谢

【问题讨论】:

  • MySQL 还是 PostgreSQL? MySQL 在函数 COUNT() 的文档中对此进行了解释
  • 感谢您写得很清楚的问题!

标签: mysql sql postgresql


【解决方案1】:

很简单:

count(<expression>) 计算值的数量。与大多数聚合函数一样,它会在进行实际聚合之前删除 null 值。

count(*) 是一种特殊情况,它计算行数(不管任何null)。

count(无论是* 还是<expression>)永远不会返回null(与大多数其他聚合函数不同)。如果没有聚合行,则结果为0

现在,您已经对一个可为空的列执行了group bygroup bynull 值放入同一组。这意味着,nbrnull 的组有两行。如果您现在应用count(nbr),则会在聚合之前删除空值,从而为您提供0 作为结果。

如果您要执行count(id),则不会删除任何null 值,从而为您提供2

这是标准的 SQL 行为,几乎每个数据库都遵守。

一个常见的用例是在本机不支持它的数据库中模拟filter 子句:http://modern-sql.com/feature/filter#conforming-alternatives

例外(在聚合之前不删除 null 的聚合函数)是 json_arrayaggjson_objectaggarray_agg 等函数。

【讨论】:

  • 感谢解答,给count() 统计取出null值后的值个数,怎么解释null和count为0的行,看select nbr的输出, nbr 来自测试组的计数(nbr);以上,提前致谢。
  • 因为计数是独立的,你仍然按 nbr 分组。所以空值仍然存在;但计数与分组无关。
【解决方案2】:

MySQL在函数COUNT()的文档中有说明:

COUNT(expr)

返回SELECT 语句检索的行中非NULL 值的计数。

COUNT(*) 有点不同,它返回检索到的行数的计数,无论它们是否包含NULL 值。


PostgreSQLdocumentation中也有解释:

大多数聚合函数会忽略 null 输入,因此其中一个或多个表达式产生 null 的行将被丢弃。对于所有内置聚合,除非另有说明,否则可以假定为 true。

例如,count(*) 产生输入行的总数; count(f1) 产生其中f1 为非空的输入行数,因为count 忽略nulls;和count(distinct f1) 产生f1 的不同非null 值的数量。

【讨论】:

    【解决方案3】:

    count(*) 按列计算与组相关的行数。独立于 fatc 分组中的列包含空值或非空值

    count(nbr)统计nbr不为null的group by column相关的行数

    【讨论】:

      【解决方案4】:

      使用空值计数:

      SELECT nbr, COUNT(*) FROM mytables WHERE nbr IS NULL GROUP BY nbr
      
      UNION
      
      SELECT nbr, COUNT(nbr) FROM mytables WHERE nbr IS NOT NULL GROUP BY nbr
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-23
        • 2021-01-14
        • 2015-11-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多