在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、它们是如何工作的,以及如何使用它们来组合三个表。