Module 03 · Intermediate SQL
Grouping Result Sets对 SELECT 语句结果集进行分组
欢迎学习本课程,本视频将介绍检索关系数据库数据、排序和分组结果集显示的一些高级技术。
学习目标
完成本课程后,您将能够:
- 解释如何从结果集中消除重复项。
- 描述如何进一步限制结果集。
1 消除结果集中的重复项 (DISTINCT)
有时 SELECT 语句的结果集可能包含重复值。
重复项示例
以简化图书馆数据库中的 Author** 表**为例,country 列列出了作者所在国家的两个字母的代码。如果我们只选择 country 列并进行排序:
SQL
SELECT country FROM Author
ORDER BY 1;
- 结果: 假设
Author表中有 20 位作者,该结果集将显示 20 行,按国家/地区字母顺序排列。 - 问题: 由于有些作者来自同一国家,结果集中包含重复的国家代码。然而,我们需要的只是一个国家列表。
使用DISTINCT关键字
为了消除重复项,我们使用关键字 DISTINCT。
SQL
SELECT DISTINCT country FROM Author
ORDER BY 1;
- 作用: 使用
DISTINCT后,结果集将减少到只包含不重复的国家/地区,例如仅显示 6 行(如果 20 位作者来自 6 个不同的国家)。
2 使用GROUP BY和聚合函数
如果我们想知道每个国家有多少位作者,我们需要对结果进行分组和计数。
GROUP BY** 子句**
- 作用:
GROUP BY子句将结果集根据一个或多个列的匹配值分组为子集。 - 计数示例: 我们使用
GROUP BY对国家进行分组,然后使用COUNT** 函数**对每个组进行计数。
SQL
SELECT country, COUNT(country)
FROM Author
GROUP BY country;
- 结果集中的列名: 请注意,结果集中的第二列是使用
COUNT函数计算得出的,因此它在表中没有直接可用的列名。
使用别名 (AS)
为了帮助阐明结果集的含义,我们可以使用关键字 AS 为计算得出的列分配一个列名(别名)。
SQL
SELECT country, COUNT(country) AS Author_Count
FROM Author
GROUP BY country;
- 作用: 在这个例子中,我们将派生列名更改为
Author_Count,使结果集更清晰。
3 使用HAVING进一步限制分组结果
现在,如果我们在分组计数的基础上,想进一步限制结果行数,例如,只查看作者数量超过四位的国家,就需要用到 HAVING** 子句**。
HAVING** 子句**
- 作用:
HAVING子句用于与GROUP BY** 子句结合使用,对分组后的结果**设置条件。 - 重要区别:
WHERE** 子句作用于整个结果集**(在分组之前)。HAVING** 子句仅作用于GROUP BY子句**创建的组。
HAVING** 示例**
要检查是否有超过四位作者来自同一国家,我们向 SELECT 语句添加以下条件:
SQL
SELECT country, COUNT(country) AS Author_Count
FROM Author
GROUP BY country
HAVING COUNT(country) > 4;
- 结果: 结果集中只会列出作者人数大于等于五位的国家。
- 示例结果: 假设结果显示中国 (China) 有 6 位作者,印度 (India) 也有 6 位作者。
总结
现在您已经掌握了:
- 如何使用
DISTINCT** 关键字从结果集中消除重复项**。 - 如何使用
GROUP BY和HAVING** 子句对结果进行分组和进一步限制**。
您是否希望我展示一个结合了 ORDER BY、GROUP BY 和 HAVING 的复杂查询示例?