聚集与分组操作,如表2-9所示。
表2-9 聚集与分组操作说明
| 方法 | 描述 |
| COUNT ([ALL | DISTINCT] expression | *) | 对结果集中的元组数量进行计数,如果是COUNT(*)那么会统计所有元组(包括NULL值)的数量,如果是COUNT(colname),那么会忽略NULL值,只统计非NULL值的数量 |
| SUM ([ALL | DISTINCT] expression) | 对参数中的属性中的所有值求和 |
| AVG ([ALL | DISTINCT] expression) | 对参数中的属性中的所有值取平均值,要求列的类型必须是数值类型,其中NULL值将会被忽略 |
| MAX ([ALL | DISTINCT] expression) | 对参数中的属性求最大值,NULL值会被忽略 |
| MIN ([ALL | DISTINCT] expression) | 对参数中的属性求最小值,NULL值会被忽略 |
对于COUNT函数,可以将参数指定为“*”,这样就会统计所有的元组数量,即使元组中包含NULL值,仍然会进行统计。
例2-34:对t1表的所有元组数量进行统计。例如:
SELECT COUNT(*) FROM t1;
count
-------
3
(1 row)
如果给COUNT函数的参数指定为表达式(或列值),则只统计表达式结果为非NULL值的个数。
例2-35:对t1表的c2列中的非NULL值的个数进行统计。例如:
SELECT COUNT(c2) FROM t1;
count
-------
2
(1 row)
如果在参数中指定了DISTINCT关键字,则先对结果中的值去掉重复值,然后再统计数量,如果不指定DISTINCT,则默认为ALL。
例2-36:对t1表的c1列中的非NULL值的个数进行统计,去掉重复值。例如:
SELECT COUNT(DISTINCT t1.c1) FROM t1;
count
-------
2
(1 row)
AVG函数、SUM函数、MIN/MAX函数同理。
例2-37:对表t1的c1列做求和操作。例如:
SELECT SUM(c1) FROM t1;
sum
-----
4
(1 row)
例2-38:对表t1的c1列求平均值。例如:
SELECT AVG(c1) FROM t1;
avg
--------------------
1.3333333333333333
(1 row)
在实际场景中,可能会统计每个组织所包含的人数,假设有一个关于组成成员信息的基本表,如表2-10所示。
表2-10 组成成员信息表
| 成员姓名 | 所在组织 |
| 成员A | 组织1 |
| 成员B | 组织2 |
| 成员C | 组织1 |
| 成员D | 组织2 |
| 成员E | 组织3 |
那么要获得每个组织的人数就需要执行多次查询才能实现,具体语句如下:
SELECT COUNT(*) FROM 成员 WHERE 成员组织 = 1;
SELECT COUNT(*) FROM 成员 WHERE 成员组织 = 2;
……
使用分组方法可以帮助我们方便的解决这个问题,分组方法使用GROUP BY关键字来指定,通常形式如下:
GROUP BY column1, column2…
如果要简化上面的多条语句,则可以通过GROUP BY方法来实现,下面的方法可以统计每个组织中的成员的数量,具体语句如下:
SELECT 组织,COUNT(*) FROM 成员 GROUP BY 成员组织;
通过这样的语句,就可以获得如表2-11的结果。
表2-11 成员数量查询结果
| 组织 | 人员数量 |
| 组织1 | 2 |
| 组织2 | 2 |
| 组织3 | 1 |
另外还可以考虑使用HAVING帮助筛选出符合条件的成员(找出成员人数大于1个的成员组织),具体语句如下:
SELECT 组织,COUNT(*) FROM 成员 GROUP BY 成员组织 HAVING COUNT(*) > 1;
则可以获得如表2-12的结果(其中组织3中只有1个成员,被HAVING字句过滤掉了)。
表2-12 成员人数大于1个的成员组织
| 组织 | 人员数量 |
| 组织1 | 2 |
| 组织2 | 2 |
例2-39:根据表t1的c2列做分组,求每个分组内c1的个数,具体语句如下:
SELECT c2, COUNT(c1) FROM t1 GROUP BY c2;
c2 | count
----+-------
| 1
2 | 2
(2 rows)
例2-40:根据表t1的c2做分组,求每个分组内成c1的个数,将个数大于1的分组投影出来,具体语句如下:
SELECT c2, COUNT(c1) FROM t1 GROUP BY c2 HAVING count(c1) > 1;
c2 | count
----+-------
2 | 2
(1 row)




