Logo
Section 1 / 6

连接的类型

本课程讨论了 ANSI SQL 规定的不同类型的连接。

导入

连接的类型

本课程讨论了 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 的某一行进行连接。对于上述两个示例表的交叉连接,结果如下:

MovieIDMovieNameMovieIDCinemaNameRunForDays
1星球大战2纳兹影院101
1星球大战5阿波罗剧院45
2印度电影《沙浪》2纳兹影院101
2印度电影《沙浪》5阿波罗剧院45
3意大利任务2纳兹影院101
3意大利任务5阿波罗剧院45

内连接(Inner Join)

在内连接中,会测试一个或多个条件,以决定表 A 的某一行是否应与表 B 的某一行连接。这个条件称为连接谓词。在我们的示例中,两个表都包含 MovieID 列作为共同值,该列建立了两表之间的关联。通过这个共同列,我们可以判断某部电影是否在数据库中的某个影院上映过,以及上映了多少天。

MovieIDMovieNameMovieIDCinemaNameRunForDays
2印度电影《沙浪》2纳兹影院101

在集合论中,内连接的维恩图表示如下:

左外连接(Left Outer Join)

在左连接中,结果集包含满足连接谓词的行,以及左表中不满足连接谓词的行。对于来自右表的列,未匹配的行将填充为 NULL。换句话说,左表的所有行都会出现在结果集中,而右表的行只有在满足连接条件时才会被包含。

MovieIDMovieNameMovieIDCinemaNameRunForDays
1星球大战NULLNULLNULL
2印度电影《沙浪》2纳兹影院101
3意大利任务NULLNULLNULL

右外连接(Right Outer Join)

右连接是左连接的相反操作。在这种情况下,右表的所有行都会出现在结果集中,而左表的行只有在满足连接条件时才会被包含。在左连接和右连接中,我们明确指定了当连接谓词不满足时,哪一侧的表可以保留行。

MovieIDMovieNameMovieIDCinemaNameRunForDays
2印度电影《沙浪》2纳兹影院101
NULLNULL5阿波罗剧院45

全外连接(Full Outer Join)

在全连接中,两个表的所有行都会被包含在结果集中。满足连接谓词的行只出现一次,而不满足谓词的行会在另一张表对应的列中填充为 NULL。需要注意的是,MySQL 不支持全连接。

MovieIDMovieNameMovieIDCinemaNameRunForDays
1星球大战NULLNULLNULL
2印度电影《沙浪》2纳兹影院101
3意大利任务NULLNULLNULL
NULLNULL5阿波罗剧院45

在集合论中,全连接的维恩图表示如下:

自连接(Self Join)

自连接是指一个表与自身进行连接的结果。如果我们基于 MovieID 对电影表进行自连接,结果如下:

MovieIDMovieNameMovieIDMovieName
1星球大战1星球大战
2印度电影《沙浪》2印度电影《沙浪》
3意大利任务3意大利任务

基础SQL

自连接(Self Inner Join)