组中的NULL值计数

时间:2017-09-29 16:46:31

标签: mysql sql postgresql

出于简化目的,我将使用简单的表属性(意思是表更大)来演示问题:

我有以下表格测试:

 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(*)之间的区别 有人可以解释这个,就像我五岁,谢谢

4 个答案:

答案 0 :(得分:8)

非常简单:

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

count(*)是一个计算行数的特殊情况(无论null如何)。

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

现在,您已在可空列上完成了group bygroup bynull值放入同一组。也就是说,nbr null的组有两行。如果您现在应用count(nbr),则会在汇总前删除空值,从而为您提供0

如果您执行count(id),则不会删除null值,只会为您提供2

这是标准的SQL行为,几乎每个数据库都受到尊重。

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

例外(在汇总之前不删除null的汇总功能)是json_arrayaggjson_objectaggarray_agg等功能。

答案 1 :(得分:4)

MySQL 在函数COUNT()的文档中解释了它:

  

COUNT(expr)

     

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

     

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

PostgreSQL 也在documentation中解释了它:

  

大多数聚合函数忽略null个输入,因此丢弃其中一个或多个表达式为空的行。除非另有说明,否则对于所有内置聚合,可以认为这是真的。

     

例如,count(*)产生输入行的总数; count(f1)生成f1非空的输入行数,因为count忽略null s;并且count(distinct f1)会产生null的不同非f1值的数量。

答案 2 :(得分:2)

count(*)按字符串计算与组相关的行数。在fatc中,group by中的列包含null或not null值

count(nbr)计算与nbr不为空的列相关的行数

答案 3 :(得分:0)

以空值计数:

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