25 SQL Group By & Having
1. 定义
慕课解释:
Group By
用于数据分组,一般与聚合函数一起使用,对分组后的数据进行聚合操作。由于 Where 无法与聚合函数一起搭配使用,因此 SQL 增加Having
指令。
2. 前言
本小节,我们将一起学习Group By
和Having
。
SQL 不仅提供数据操作功能相关的指令,而且也提供了一些指令进行数据统计和分析。如,Group By 提供了分组功能对数据分门别类,Having 可以与聚合函数搭配用于筛选数据。
本小节测试数据如下,请先在数据库中执行:
DROP TABLE IF EXISTS imooc_user;
CREATE TABLE imooc_user
(
id int PRIMARY KEY,
username varchar(20),
age int,
score int
);
INSERT INTO imooc_user(id,username,age,score)
VALUES (1,'peter', 18, 100),(2,'pedro', 24, 500),
(3,'jerry', 24, 500),(4,'mike', 18, 100),(5,'tom', 20, 1000);
提示: 如果你还不熟悉聚合函数,请先阅读聚合函数小节。
3. Group By
Group By 会根据 By 后面的数据字段来分组,并且根据给定的聚合函数来分组进行聚合操作。
使用语法如下:
SELECT [agg] FROM [table_name] GROUP BY [col];
其中agg
表示聚合函数,table_name
表示数据表名称,col
表示字段名称。
3.1 例1 单字段Group By
请书写 SQL 语句,将imooc_user
表中的用户通过age
进行分组,并返回每个分组的用户数。
分析:
题干中明确指出根据 age 进行分组,因此 Group By 应该后接 age,统计每个分组的用户数使用聚合函数 Count。
语句:
整理可得语句如下:
SELECT age, COUNT(*) FROM imooc_user GROUP BY age;
结果如下:
+-----+----------+
| age | COUNT(*) |
+-----+----------+
| 18 | 2 |
| 24 | 2 |
| 20 | 1 |
+-----+----------+
提示:
COUNT(*)
在数据库层面有专门的优化,其性能跟COUNT(1)
大致相同。
3.2 例2 多字段 Group By
Group By 不仅支持单字段分组,同时也支持多字段分组。
请书写 SQL 语句,使用 age 和 score 字段对imooc_user
表中的用户进行分组,并返回每个分组的用户数。
分析:
题干中明确指出根据 age 和 score 进行分组,因此 Group By 应该后接 age,score,统计每个分组的用户数使用聚合函数 Count。
语句:
整理可得语句如下:
SELECT age, score, COUNT(*) FROM imooc_user GROUP BY age, score;
结果如下:
+-----+-------+----------+
| age | score | COUNT(*) |
+-----+-------+----------+
| 18 | 100 | 2 |
| 24 | 500 | 2 |
| 20 | 1000 | 1 |
+-----+-------+----------+
4. Having
Having 不能单独出现,须于聚合函数搭配使用,且常与 Group By 一起出现。Having 本身并无其他含义,它的主要功能是替代 Where。
使用语法如下:
SELECT [agg] FROM [table_name] GROUP BY [col] HAVING [condition];
其中agg
表示聚合函数,table_name
表示数据表名称,col
表示字段名称,condition
表示过滤条件。
4.1 例3 使用 Having
请书写 SQL 语句,将imooc_user
表中的用户通过 age 进行分组,并返回每个分组的用户数,且每个分组的用户数必须大于1
。
分析:
题干中明确指出根据 age 进行分组,因此 Group By 应该后接 age,统计每个分组的用户数使用聚合函数 Count,且使用 Having 过滤。
语句:
整理可得语句如下:
SELECT age, COUNT(*) FROM imooc_user GROUP BY age HAVING COUNT(*) > 1;
结果如下:
+-----+----------+
| age | COUNT(*) |
+-----+----------+
| 18 | 2 |
| 24 | 2 |
+-----+----------+
5. 小结
- Group By 和 Having 常被用于数据分析和统计,是可视化和报表的利器。
- Having 局限于聚合函数,它无法使用在其它场景下。