Coursera 笔记

Module 03 · Intermediate SQL

Grouping Result Sets对 SELECT 语句结果集进行分组

Coursera ↗

欢迎学习本课程,本视频将介绍检索关系数据库数据、排序和分组结果集显示的一些高级技术。


学习目标

完成本课程后,您将能够:

  • 解释如何从结果集中消除重复项。
  • 描述如何进一步限制结果集。

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 的复杂查询示例?