在SQL中连接三个表

在关系数据库中,从多个表中检索数据的任务非常常见。根据目标结果,这涉及到将多个表连接到单个单元并获取结果数据。

当涉及到连接时,我们大多数人主要处理两个表之类的限制。然而,为了获得更有意义的数据布局和洞察,通常需要连接三个表。例如,您希望检索电影列表、相应的租赁清单和实际租赁详细信息。每个单元(如电影、库存和租赁细节)都在单独的表中。

在本教程中,我们将向您介绍用于在SQL中连接三个表的各种连接和技术。

要求:

出于演示目的,我们将使用MySQL版本80和Sakila示例数据库。为了继续学习,您可以下载并在MySQL服务器中设置Sakila数据库。您可以随意使用您认为适用的任何其他数据集。

SQL中的连接类型

在讨论连接的应用程序之前,让我们首先讨论SQL数据库中可用的各种类型的连接。

内连接

第一种连接类型是INNER join。这种类型的连接仅返回两个表中包含匹配值的行。这是一种非常常见的连接类型,并且在连接两个表时最简单。

语法如下:

选择列

从表1

在表1上内连接表2。Column_name = table2.column_name

左连接

在LEFT JOIN的情况下,它返回左表中的所有行和右表中的匹配行。如果右表中没有匹配的值,则连接将在其位置添加NULL值。

语法如下:

选择列

从表1

在表1上左连接表2。Column_name = table2.column_name

正确的连接

可以猜到,RIGHT JOIN与LEFT JOIN是相反的。这种类型的连接返回右表中的所有行,只返回左表中的匹配行。如果左表中没有匹配的行,则连接将向其添加NULL值。

下面是RIGHT JOIN的语法:

选择列

从表1

在表1上右连接表2。Column_name = table2.column_name

全外连接

您将在SQL数据库中遇到的下一种连接类型是FULL OUTER join。当在右表或左表中存在匹配时,这种类型的连接返回所有行。如果两者中任何一个都没有匹配的值,它将为表中没有匹配的列返回NULL。

下面演示了一个完整的OUTER JOIN的语法:

选择列

从表1

在表1上完全连接表2。Column_name = table2.column_name

请记住,并非所有数据库引擎都支持FULL OUTER join。要实现这一点,您可能需要使用其他类型的join或子查询。

例子:

让我们探索一些示例,了解如何使用这些类型的连接来连接SQL中的三个表。

例1:使用INNER JOIN

我们从INNER JOIN开始。假设我们想要检索电影列表、租赁清单和相应的租赁详细信息。

我们可以在关联的表上使用多个INNER join,如下例所示:

选择

film.title,

inventory.inventory_id,

rental.rental_date

电影

内连接库存在

电影。Film_id = inventory.film_id

内连接租赁

库存。Inventory_id = rent . Inventory_id;

在给定的示例查询中,我们首先根据“film_id”列连接电影表和库存表。然后,我们将结果集与基于“inventory_id”列的租赁表连接起来。

这确保我们用基本的INNER join连接三个表。结果集如下:

示例2:使用内连接和左连接

假设我们现在需要电影列表、租赁清单列表(如果有的话)和相关的租赁详细信息。

我们还希望确保,即使一部电影没有出租库存,我们仍然将其包含在结果中。这就是INNER JOIN和LEFT JOIN发挥作用的地方。

考虑下面的例子:

选择

film.title,

inventory.inventory_id,

rental.rental_date

电影

内连接库存在

电影。Film_id = inventory.film_id

左加入租赁ON

库存。Inventory_id = rent . Inventory_id;

在本例中,我们使用INNER JOIN来连接电影和库存表,以确保我们获得具有可用库存的标题。然后,我们使用LEFT JOIN连接租赁表以获取可用的租赁详细信息,对于没有租赁历史记录的任何标题则为NULL。

结果集如下:

结论

在本教程中,我们了解了SQL中各种类型的join、它们是如何工作的,以及如何使用它们来组合三个表。