MySQL group by 和 having使用详解

发布 : 2019-07-29 浏览 :

前言

在日常开发中,group by 和 having是频繁使用到的,这两个通常是和MySQL聚合函数一起使用的,今天我们就通过SQL语句对这两者进行详细解析。

准备数据表

我自己做测试的数据表是一张全国省市区表,表内记录了全国所有省市区详细信息,完全可以用来讲解group by 和 having;
数据表地址

SQL实例

1.显示每个省份所属直辖市

1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT
a.id,
a.name,
group_concat( a.name ),
b.parent_id,
b.name
FROM
district a
INNER JOIN district b ON a.parent_id = b.id
WHERE
b.parent_id = 0
GROUP BY
b.name;

使用自连接找出省份与市区的关系(a表记录直辖市,b表记录省份),再用group by分组,条件是省份,group_cancat函数是把每个省所属的市列出来;

查询结果如下:

2.显示每个省份的省会以及所属直辖市数量

1
2
3
4
5
6
7
8
9
10
11
12
SELECT
a.id,
a.name AS '省会',
b.name,
count( a.name ) AS city_count
FROM
district a
INNER JOIN district b ON a.parent_id = b.id
WHERE
b.parent_id = 0
GROUP BY
b.name

使用自连接找出省份与市区的关系(a表记录直辖市,b表记录省份),再用group by分组,条件是省份,再使用聚合函数对每组中的一条或多条字段进行运算;

查询结果如下:

3.显示每个省份的省会以及所属直辖市数量且城市数量大于10

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT
a.id,
a.name AS '省会',
b.parent_id,
b.name,
count( a.name ) AS city_number
FROM
district a
INNER JOIN district b ON a.parent_id = b.id
WHERE
b.parent_id = 0
GROUP BY
b.name
HAVING
count( a.name ) > 10

使用自连接找出省份与市区的关系(a表记录直辖市,b表记录省份),再用group by分组,条件是省份,再使用聚合函数对每组中的一条或多条字段进行运算,最后在使用having对分组后的数据进行筛选;

查询结果如下:

结语

having是分组(group by)后的筛选条件,分组后的数据组内再筛选,而where是在分组前筛选,日常开发中我们经常遇到这类问题,只有通过例子来实际操作,我们才能真正理解它,赶紧去尝试一波吧!

知识 & 情怀 | 二者兼得

微信扫一扫, 向我投食

微信扫一扫, 向我投食

支付宝扫一扫, 向我投食

支付宝扫一扫, 向我投食

留下足迹