SQL外连接
不用说,连接是关系数据库最明显的特性之一。连接允许我们根据相关条件组合来自一个或多个表的数据,以创建一致的数据操作。
SQL中有各种类型的连接,每种连接都有其独特的方式来处理来自参与表或结果集的数据。SQL中最常见的连接类型之一是OUTER join。
SQL中的OUTER JOIN从相关表中检索所有匹配的行,以及从一个或两个表中检索不匹配的行。当您处理包含NULL值或缺失集的表时,它会派上用场。
让我们进一步探讨这些连接的作用、工作原理以及如何在SQL数据库中使用它们。
要求:
在本教程中,我们将使用MySQL 8.0并使用Sakila示例数据库。但是,您可以随意使用您认为适用的任何其他数据集。
外连接的类型
SQL中有三种主要的OUTER join类型。这些类型的OUTER join包括:
-
左外连接
-
右外连接
-
全外连接
在LEFT OUTER JOINS的情况下,join从左表中检索所有行,只从右表中检索匹配的行。如果右表中没有匹配的行,则连接返回右表中列的NULL值。
这类似于RIGHT OUTER JOIN。但是,它从右表中检索所有行,而只从左表中检索匹配的行。如果左表中没有匹配的行,则连接包含左表上列的NULL值。
最后,我们有FULL OUTER join。这种类型的连接结合了右外部连接和左外部连接。因此,当在左表或右表中存在匹配时,连接将检索所有行。如果没有匹配,则连接返回表中没有匹配的列的NULL值。
SQL OUTER JOIN的语法
下面表示SQL OUTER JOIN的语法。不过,最好记住,语法可能会因目标数据库引擎的不同而略有不同。
一般结构如下:
选择列
从表1
[LEFT | RIGHT | FULL]外连接表2
在表1。Column_name = table2.column_name
SQL中OUTER JOIN的语法是不言自明的。
例子:
让我们看一下如何在SQL中应用各种类型的OUTER join的一些示例用法。
如前所述,我们将使用Sakila示例数据库进行演示。在本例中,我们使用“customer”和“payment”表。
例1:左外连接
让我们从一个OUTER JOIN开始。假设我们希望检索所有客户信息以及他们的付款信息(如果可用)。
这使得LEFT OUTER JOIN适用,因为我们需要所有客户信息(左侧)和付款信息(如果可用)(右侧)。
如果客户没有进行任何支付,则连接将显示与支付相关列的NULL值。
示例如下:
选择
c.customer_id,
c.first_name,
c.last_name,
p.amount,
p.payment_date
从
客户c
左外连接付款p
在
c.customer_id = p.customer_id;
在给定的查询中,我们包括来自“customer”表的“customer_id”、“first_name”和“last_name”列。我们还包括来自“付款”表的金额和“payment_date”。
然后,我们基于“customer_id”在“customer”和“payment”表之间执行一个LEFT OUTER JOIN。
这些是所有客户(无论是否付款)以及他们的付款细节(如果有的话)。
使用示例输出如下:
例2:右外连接
现在,让我们转到RIGHT OUTER JOIN。假设我们希望在本例中包含所有付款信息和相关客户(如果有的话)。
在本例中,如果客户付款,则连接将显示该客户的详细信息。如果付款没有关联客户,它将显示客户相关列的NULL值。
选择
c.customer_id,
c.first_name,
c.last_name,
p.amount,
p.payment_date
从
客户c
右外连接付款p
在
c.customer_id = p.customer_id;
结果集如下:
例3:完全外连接
另一方面,FULL OUTER JOIN检索所有客户信息和付款。这包括所有客户和所有付款,并在表之间没有匹配时显示NULL值。
选择
c.customer_id,
c.first_name,
c.last_name,
p.amount,
p.payment_date
从
客户c
完全外连接付款p
在
c.customer_id = p.customer_id;
请记住,MySQL本身不支持FULL OUTER JOIN。您必须使用左JOIN、UNION和右JOIN来做一些柔术魔术。我们可能会补充说,这很烦人。
结论
在本教程中,我们学习了有关OUTER join的所有知识。我们学习了什么是SQL中的OUTER JOIN、OUTER JOIN的类型以及如何使用这些类型的OUTER JOIN的示例。