连接的类型
本课程讨论了 ANSI SQL 规定的不同类型的连接。
连接类型
在上一节中,我们通过单个表学习了 SQL 的基础知识。然而,关系型数据库定义了表之间的关联,通常查询需要从两个或更多表中获取信息。连接(Join)允许我们通过表之间的共同列将多个表的行合并在一起。事实上,表之间定义的关系正是关系型数据库被称为“关系型”的原因。
为了更好地理解这些概念,我们将使用两个共享一个共同列的表进行演示。这两个表如下所示:
### 电影表 | MovieID | MovieName | | - | - | | 1 | 星球大战 | | 2 | 印度电影《沙浪》 | | 3 | 意大利任务 |
### 电影院表 | MovieID | CinemaName | RunForDays | | - | - | - | | 2 | 纳兹影院 | 101 | | 5 | 阿波罗剧院 | 45 |
ANSI SQL 标准定义了五种类型的连接,我们将逐一讨论。
交叉连接(Cross Join)
我们首先介绍交叉连接,也称为笛卡尔积。在这种情况下,我们选取表 A 的第一行,并与表 B 的每一行进行匹配;接着选取表 A 的第二行,同样与表 B 的每一行进行匹配。这里没有指定任何条件来判断表 A 的某一行是否应与表 B 的某一行进行连接。对于上述两个示例表的交叉连接,结果如下:
| MovieID | MovieName | MovieID | CinemaName | RunForDays |
|---|---|---|---|---|
| 1 | 星球大战 | 2 | 纳兹影院 | 101 |
| 1 | 星球大战 | 5 | 阿波罗剧院 | 45 |
| 2 | 印度电影《沙浪》 | 2 | 纳兹影院 | 101 |
| 2 | 印度电影《沙浪》 | 5 | 阿波罗剧院 | 45 |
| 3 | 意大利任务 | 2 | 纳兹影院 | 101 |
| 3 | 意大利任务 | 5 | 阿波罗剧院 | 45 |
内连接(Inner Join)
在内连接中,会测试一个或多个条件,以决定表 A 的某一行是否应与表 B 的某一行连接。这个条件称为连接谓词。在我们的示例中,两个表都包含 MovieID 列作为共同值,该列建立了两表之间的关联。通过这个共同列,我们可以判断某部电影是否在数据库中的某个影院上映过,以及上映了多少天。
| MovieID | MovieName | MovieID | CinemaName | RunForDays |
|---|---|---|---|---|
| 2 | 印度电影《沙浪》 | 2 | 纳兹影院 | 101 |
在集合论中,内连接的维恩图表示如下:
左外连接(Left Outer Join)
在左连接中,结果集包含满足连接谓词的行,以及左表中不满足连接谓词的行。对于来自右表的列,未匹配的行将填充为 NULL。换句话说,左表的所有行都会出现在结果集中,而右表的行只有在满足连接条件时才会被包含。
| MovieID | MovieName | MovieID | CinemaName | RunForDays |
|---|---|---|---|---|
| 1 | 星球大战 | NULL | NULL | NULL |
| 2 | 印度电影《沙浪》 | 2 | 纳兹影院 | 101 |
| 3 | 意大利任务 | NULL | NULL | NULL |
右外连接(Right Outer Join)
右连接是左连接的相反操作。在这种情况下,右表的所有行都会出现在结果集中,而左表的行只有在满足连接条件时才会被包含。在左连接和右连接中,我们明确指定了当连接谓词不满足时,哪一侧的表可以保留行。
| MovieID | MovieName | MovieID | CinemaName | RunForDays |
|---|---|---|---|---|
| 2 | 印度电影《沙浪》 | 2 | 纳兹影院 | 101 |
| NULL | NULL | 5 | 阿波罗剧院 | 45 |
全外连接(Full Outer Join)
在全连接中,两个表的所有行都会被包含在结果集中。满足连接谓词的行只出现一次,而不满足谓词的行会在另一张表对应的列中填充为 NULL。需要注意的是,MySQL 不支持全连接。
| MovieID | MovieName | MovieID | CinemaName | RunForDays |
|---|---|---|---|---|
| 1 | 星球大战 | NULL | NULL | NULL |
| 2 | 印度电影《沙浪》 | 2 | 纳兹影院 | 101 |
| 3 | 意大利任务 | NULL | NULL | NULL |
| NULL | NULL | 5 | 阿波罗剧院 | 45 |
在集合论中,全连接的维恩图表示如下:
自连接(Self Join)
自连接是指一个表与自身进行连接的结果。如果我们基于 MovieID 对电影表进行自连接,结果如下:
| MovieID | MovieName | MovieID | MovieName |
|---|---|---|---|
| 1 | 星球大战 | 1 | 星球大战 |
| 2 | 印度电影《沙浪》 | 2 | 印度电影《沙浪》 |
| 3 | 意大利任务 | 3 | 意大利任务 |