SQL连接类型--内连接和外连接示例

533 阅读6分钟

在关系型数据库中,所有的信息应该只出现一次。但是,你可能会有分离在不同表中的信息,这些信息是相互关联的。

而你可能想把这些相关的信息放在一起分析其数据--也就是说,你可能想把所有的数据(或其中一部分)连接在一起。在这种情况下,你需要使用SQL的JOIN 语句。让我们学习一下它是如何工作的。

什么是SQL中的JOIN?

正如我在上面简单解释的那样,JOIN操作符可以让你以各种方式组合相关信息。有各种类型的连接,主要分为两类--内联和外联。

内联和外联的最大区别是,内联将只保留两个表中相互关联的信息(在结果表中)。另一方面,外连接也会在结果表中保留与其他表无关的信息。

让我们看看INNER JOIN和OUTER JOIN的详细工作情况,以便更好地理解它们。

如何在SQL中使用INNER JOIN

内联将只保留两个联接表中相关的信息。如果你把这两个表想象成一个维恩图,那么由内联产生的表将是下面它们重叠的绿色突出部分:

Two circles, one labelled table 1 and one labelled table 2, with a section in common. The section in common is colored in green.

内联表的维恩图表示

下面是内联接的语法:

SELECT * FROM table1
    JOIN table2
    ON relation;

内联的语法

我们将在下面的例子中看到它是如何工作的。

如何在SQL中使用OUTER JOIN

如果你想保留所有的数据,而不仅仅是相互关联的数据,你可以使用一个OUTER连接。

有三种类型的外联接。LEFT JOIN,RIGHT JOIN, 和FULL JOIN 。它们之间的区别涉及到保留哪些不相关的数据--可以是第一个表中的,也可以是第二个表中的,或者是两个表中的。没有数据填充的单元格将有一个值:NULL

注意:LEFT JOIN 是所有版本的SQL中最普遍的实现。但是,RIGHT JOINFULL JOIN 则不是这样,它们在各种SQL版本中都没有实现。

让我们看看每个人是如何单独工作的。然后我们再通过下面的例子看看它们都是如何工作的。

SQL中的LEFT OUTER JOIN

LEFT OUTER JOIN,或者简单的说是Left Join,将保留左边(第一个)表中的不相关的数据。

你可以把它想象成一个有两个圆圈的维恩图,结果表是绿色的高亮部分,包括共同/重叠部分,以及左边圆圈的其余部分。

Two circles with a superimposed part. The left circle is labelled as table 1, the right circle is tabelled as table 2. The superimposed part and the rest of the table 1 cirlcle are colored in green.

左外联接的维恩图表示

语法看起来如下所示。你会看到它与Inner Join的语法相似,但加入了LEFT 关键字:

SELECT columns
  FROM table1
  LEFT JOIN table2
  ON relation;

左外联接

SQL中的RIGHT OUTER JOIN

RIGHT OUTER JOIN,或者简称为Right Join,将把与第一个表无关的数据保留在第二个表中。

你可以用一个有两个圆圈的维恩图来想象它,结果表是绿色突出显示的部分,它包括重叠的部分,以及右圈的其余部分:

Two circles with a superimposed part. The left circle is labelled as table 1, the right circle is tabelled as table 2. The superimposed part and the rest of the table 2 cirlcle are colored in green.

右外联接的维恩图表示

语法如下,唯一不同的是RIGHT 关键字:

SELECT columns
  FROM table1
  RIGHT JOIN table2
  ON relation;

右外联接

SQL中的FULL OUTER JOIN

你可以认为FULL OUTER JOIN是左联接和右联接的组合。它将保留两个表中的所有记录,而缺失的数据将用NULL 来填补。

你可以用一个有两个圆圈的维恩图来想象它,结果表是绿色突出显示的部分,它包括了所有的东西:重叠部分、左圆和右圆。

Two circles with a superimposed part. The left circle is labelled as table 1, the right circle is tabelled as table 2. Everything is colored in green.

全外联的维恩图表示

语法如下,使用FULL 关键字:

SELECT columns
  FROM table1
  FULL JOIN table2
  ON relation;

全外联接

SQL JOIN操作的例子

一个兽医诊所的数据库可能有一个宠物表和一个主人表。由于一个主人可能有多个宠物,宠物表将有一个owner_id 列,指向主人表:

id名字年龄业主_id
1Fido71
2大小姐31
3茜茜102
4铜牌13
5漏斗20
id名称电话_号码
1约翰尼4567823
2奥利7486513
3伊莱尼亚3481365
4路易丝1685364

你可以用简单的查询来得到一个表,其中有宠物的名字和主人的名字相邻。让我们用所有不同的JOIN操作符来做吧。

SQL INNER JOIN例子

让我们先用JOIN

SELECT 在这种情况下,你将从pets 表的name 列(并重命名为pet_name )。然后你将从owners 表中选择name 列,并将其重命名为owner 。这看起来就像这样:SELECT pets.name AS pet_name, owners.name AS owner

你可以用FROM 来表示这些列来自pets 表,用JOIN 来表示你想把它和owners 表连接起来,使用这样的语法。FROM pets JOIN owner.

最后,当pets 表中的owner_id 列等于owner 表中的id 列时,你会说你想把两行连在一起,用ON pets.owner_id = owners.id

在这里,它是一起的:

SELECT pets.name AS pet_name, owners.name AS owner
  FROM pets
  JOIN owners
  ON pets.owner_id = owners.id;

你会得到一个如下的表,其中只包括与主人相连的宠物和与宠物相连的主人:

宠物_名称主人
菲多强尼
密西强尼
茜茜欧力
銅牌伊莲娜

SQL LEFT JOIN例子

让我们用LEFT JOIN 做同样的查询,这样你就可以看到区别。除了添加LEFT 关键字外,该查询是相同的:

SELECT pets.name AS pet_name, owners.name AS owner
  FROM pets
  LEFT JOIN owners
  ON pets.owner_id = owners.id;

在这种情况下,来自左边表pets 的行都被保留,当有数据从owners 表丢失时,就用NULL 来填补:

宠物名称主人
菲多强尼
密西强尼
茜茜欧力
銅牌伊莲娜
霍普命名

似乎有一只宠物没有注册主人。

SQL RIGHT JOIN的例子

如果你用RIGHT JOIN 做同样的查询,你会得到一个不同的结果:

SELECT pets.name AS pet_name, owners.name AS owner
  FROM pets
  RIGHT JOIN owners
  ON pets.owner_id = owners.id;

在这种情况下,所有来自右表的行,owners ,都被保留,如果有一个缺失的值,就用NULL

宠物名称主人
菲多强尼
密西强尼
茜茜欧力
銅牌伊莲娜
NULL露易丝

似乎有一个主人没有注册宠物。

SQL FULL JOIN例子

你可以再次做同样的查询,使用FULL JOIN

SELECT pets.name AS pet_name, owners.name AS owner
  FROM pets
  FULL JOIN owners
  ON pets.owner_id = owners.id;

结果表又是不同的--在这个例子中,两个表中的所有记录都被保留:

宠物名称主人
菲多强尼
密西强尼
茜茜欧力
銅牌伊莲娜
霍普NULL
毋庸置疑露易丝

看来,在我们的数据库中,有一个没有主人的宠物和一个没有宠物的主人。

结论

在一个关系型数据库中,所有的数据应该只写一次。为了分析这些数据,你需要一些东西来把相关的数据连接起来。

在这篇文章中,你已经学会了如何使用JOIN操作符来做到这一点。我希望它对你有用,祝你愉快