SQL外连接

不用说,连接是关系数据库最明显的特性之一。连接允许我们根据相关条件组合来自一个或多个表的数据,以创建一致的数据操作。

SQL中有各种类型的连接,每种连接都有其独特的方式来处理来自参与表或结果集的数据。SQL中最常见的连接类型之一是OUTER join。

SQL中的OUTER JOIN从相关表中检索所有匹配的行,以及从一个或两个表中检索不匹配的行。当您处理包含NULL值或缺失集的表时,它会派上用场。

让我们进一步探讨这些连接的作用、工作原理以及如何在SQL数据库中使用它们。

要求:

在本教程中,我们将使用MySQL 8.0并使用Sakila示例数据库。但是,您可以随意使用您认为适用的任何其他数据集。

外连接的类型

SQL中有三种主要的OUTER join类型。这些类型的OUTER join包括:

  1. 左外连接

  2. 在LEFT OUTER JOINS的情况下,join从左表中检索所有行,只从右表中检索匹配的行。如果右表中没有匹配的行,则连接返回右表中列的NULL值。

  3. 右外连接

  4. 这类似于RIGHT OUTER JOIN。但是,它从右表中检索所有行,而只从左表中检索匹配的行。如果左表中没有匹配的行,则连接包含左表上列的NULL值。

  5. 全外连接

  6. 最后,我们有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的示例。