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值的区别,有人可以解释这个,就像我五岁,谢谢
这很简单:
count(<expression>)计算值的数量.与大多数聚合函数一样,它null在执行实际聚合之前删除值.
count(*)是一个特殊情况,它计算行数(无论如何null).
count(不管*或<expression>)永远不会返回null(不像大多数其它集合函数).如果没有聚合行,结果是0.
现在,你已经在一个group by可以为空的列上做了一个.group by将null值放入同一组.这意味着,该组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等.
| 归档时间: |
|
| 查看次数: |
3829 次 |
| 最近记录: |