出于简化目的,我将使用简单的表属性(意思是表更大)来演示问题:
我有以下表格测试:
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(*)之间的区别 有人可以解释这个,就像我五岁,谢谢
答案 0 :(得分:8)
非常简单:
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
等功能。
答案 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