CREATE TABLE t1 (
C1 INTEGER,
C2 INTEGER
);
INSERT INTO t1 VALUES (1,2), (1,NULL), (2,2);
CREATE TABLE t2 (
C1 INTEGER,
C2 INTEGER
);
INSERT INTO t2 VALUES (1,2), (1,1), (NULL,2);
CREATE TABLE t3 (
C1 INTEGER,
C2 INTEGER
);
INSERT INTO t3 VALUES (1,1), (1,2);
COUNT
函数,可以将参数指定为“*”
,这样就会统计所有的元组数量,即使元组中包含NULL值,仍然会进行统计。SELECT COUNT(*) FROM t1;
count
-------
3
(1 row)
COUNT
函数的参数指定为表达式(或列值),则只统计表达式结果为非NULL值的个数。SELECT COUNT(c2) FROM t1;
count
-------
2
(1 row)
DISTINCT
关键字,则先对结果中的值去掉重复值,然后再统计数量,如果不指定DISTINCT
,则默认为ALL
。SELECT COUNT(DISTINCT t1.c1) FROM t1;
count
-------
2
(1 row)
例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)
SELECT MAX(c1) FROM t1;
max
-----
2
(1 row)
SELECT MIN(c1) FROM t1;
min
-----
1
(1 row)
在实际场景中,可能会统计每个组织所包含的人数,假设有一个组织成员信息表:
那么要获得每个组织的人数就需要执行多次查询才能实现
SELECT COUNT(*) FROM 成员 WHERE 成员组织 = 1;
SELECT COUNT(*) FROM 成员 WHERE 成员组织 = 2;
...
使用分组方法可以方便地解决这个问题,分组方法使用GROUP BY
关键字来指定,通常形式如下:
GROUP BY column1, column2, ...
如果要简化上面的多条语句,则可以通过GROUP BY
方法来实现,下面的方法可以统计每个组织中成员的数量:
SELECT 组织, COUNT(*) FROM 成员 GROUP BY 成员组织;
另外还可以考虑使用HAVING
操作帮助筛选出符合条件的成员(找出成员人数大于1的成员组织)
SELECT 组织, COUNT(*) FROM 成员 GROUP BY 成员组织 HAVING COUNT(*) > 1;
例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)