组中的NULL值计数

rac*_*iri 7 mysql sql postgresql

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

我有以下表格测试:

 id | nbr
----+-----
  1 |   0
  2 |
  3 |
  4 |   1
  5 |   1
 (5 rows)
Run Code Online (Sandbox Code Playgroud)

id和nbr都是数值

以下查询

select nbr, count(nbr) from test group by nbr;
Run Code Online (Sandbox Code Playgroud)

输出:

 nbr | count
-----+-------
     |     0
   1 |     2
   0 |     1
(3 rows)
Run Code Online (Sandbox Code Playgroud)

而查询:

select nbr, count(*) from test group by nbr;
Run Code Online (Sandbox Code Playgroud)

输出:

 nbr | count
-----+------
     |     2
   1 |     2
   0 |     1
 (3 rows)
Run Code Online (Sandbox Code Playgroud)

我发现很难解释count(nbr)和count(*)之间关于null值的区别,有人可以解释这个,就像我五岁,谢谢

Mar*_*and 9

这很简单:

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

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

count(不管*<expression>)永远不会返回null(不像大多数其它集合函数).如果没有聚合行,结果是0.

现在,你已经在一个group by可以为空的列上做了一个.group bynull值放入同一组.这意味着,该组nbr null有两行.如果您现在应用count(nbr),则会在聚合之前删除空值,从而为您0提供结果.

如果你愿意的话count(id),没有任何null价值可以删除,给你2.

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

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

唯一的例外(聚合函数不删除null之前聚合)都喜欢的功能json_arrayagg,json_objectagg,array_agg等.


axi*_*iac 8

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

COUNT(expr)

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

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


PostgreSQL还在文档中解释了它:

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

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