SQL:外连接
在我们学习如何使用 SQL Join 子句的第二部分中,我们将重点介绍外连接。第一部分讨论了内连接,您可以在这里找到。
那么,什么是外连接?与内连接类似,外连接用于根据相关列组合表来查询数据库。与内连接不同,外连接可用于返回表中不常见的数据。
外连接有多种类型,我们将根据示例进行解释。为了举例说明,我们以上一篇文章中提到的两个表为例:全外连接:此版本的连接子句将返回两个表的所有记录,并在不存在匹配项时添加。在下图中,我们将使用维恩图以图形方式解释使用全外连接子句(简称为全连接)连接这两个表的结果。null
让我们通过外连接来获取所有宠物的姓名、看过宠物的医生以及就诊日期等记录。语法如下:
由于 MySQL 不支持完全连接,因此在此DBMS中使用以下语法:
结果如下:
如您所见,我们的猫 Daisy 有两行记录,它曾在两个不同的医生处就诊,并且/或者在两个不同的日期就诊。我们的鱼 Jules 尚未就诊,因此它没有返回任何有关医生或日期的信息,因此这些字段都填充了null
。
左外连接:此连接也称为左连接,它会返回第一个表(或左表)中的所有记录,并与第二个表(或右表)中的匹配项匹配,并null
在未找到匹配项的地方添加。 如果我们想知道哪些医生看过哪些物种,我们可以使用左连接查询数据库并返回这些结果。
我们可以看到宠物表中的所有记录,以及与体检表对应的匹配项,以及与体检表不匹配的宠物记录的空白处。记住,这些空白处应被视为null
。
右外连接与左连接工作原理相同,但会反转表:它将返回右表(即第二个表)的所有记录,以及左表(即第一个表)中的匹配项,以及null
未找到匹配项的值。如果我们将上一个查询替换为右连接,它将返回相同的结果,但最后一行除外,因为该null
值对应于检查表。
带有 WHERE 子句的左外连接:还记得我们在本文开头提到过,内连接和外连接之间的一个区别是,外连接允许我们返回两个表之间不匹配的值吗?这可以通过在查询中添加 WHERE 语句来实现。 假设我们想看看哪些宠物没有做过体检。从前面的例子中,我们知道,对于我们的鱼 Jules,在尝试返回类似数据时,我们收到了相应的值。我们可以用这个值来完善我们的新查询,这样结果就会显示 Jules 尚未体检:null
很酷吧?带 WHERE 子句的右外连接也一样。
带 WHERE 子句的完全外连接:这种连接允许我们返回两个表中唯一的记录。换句话说,我们会获取除匹配项之外的所有内容。我们从pets表 中选择我们感兴趣的列,然后对它们共有的列进行完全外连接检查,WHERE 子句会检查这些列的记录,也就是说,它们没有值。null
同样,MySQL 不支持完全连接,因此查询将是:
我们的小例子只包含一个对其中一个表(确切地说是宠物表)唯一的记录,所以这就是我们结果的原因。
外连接是我们可以使用的强大工具,希望这些内容能够对问题带来一些澄清。
文章来源:https://dev.to/wendisha/sql-outer-joins-2cj7