SQL 连接类型 – 内连接 VS 外连接示例

2021-08-24 14:07:15 浏览数 (4235)

在关系型数据库中,所有信息应该只出现一次。但是因为数据库设计的问题,有些信息可能会被分成彼此相关的不同表。当我们想要将这些相关信息放在一起以分析其数据的时候,我们就需要将所有数据(或其中一些)连接在一起。在这种情况下,您需要使用 SQL 的JOIN语句。SQL连接类型有内连接,外连接(又分为左外和右外连接两种,这里我们把它们当做一种)和全连接三种,让我们了解它们是如何工作的。

SQL 中的 JOIN 是什么?

JOIN 运算符允许您以各种方式组合相关信息,正如我在上面简要解释的那样。连接有多种类型,分为两大类 - 内部连接和外部连接。

INNER JOIN 和 OUTER JOIN 之间的最大区别在于,内连接将仅保留来自彼此相关的两个表(在结果表中)的信息。另一方面,外部联接还将保留与结果表中的另一个表无关的信息。

让我们详细了解 INNER JOIN 和 OUTER JOIN 如何工作以更好地理解它们。

如何在 SQL 中使用 INNER JOIN

内部联接将仅保留来自两个相关联的表的信息。如果您将这两个表想象为维恩图,则由 INNER JOIN 生成的表将是下面它们重叠的绿色突出显示部分:

内连接
内连接的维恩图表示

这是内部联接的语法:

SELECT * FROM table1
    JOIN table2
    ON relation;
内连接语法

我们将在下面通过一个例子来了解它是如何工作的。

如何在 SQL 中使用 OUTER JOIN

如果要保留所有数据,而不仅仅是相互关联的数据,则可以使用 OUTER 联接。

有三种类型的外部联接:LEFT JOIN,RIGHT JOIN,和FULL JOIN。它们之间的差异涉及它们保留哪些不相关的数据——它可以来自第一个表、第二个表或两者。没有要填充的数据的单元格的值为NULL。

注意:LEFT JOIN是所有版本的 SQL 中最普遍实现的。但是对于RIGHT JOIN和FULL JOIN就不是这样了,在早期的各种SQL版本中都没有实现(但oracle数据库在数据表连接方面实现得比较充分)。

让我们看看每个人是如何单独工作的。然后我们将通过下面的示例了解它们是如何工作的。

SQL中的左外连接

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

您可以用带有两个圆圈的维恩图来想象它,结果表是绿色突出显示的部分,其中包括公共/重叠部分和左侧圆圈的其余部分。

左外连接
左外连接的维恩图表示

语法如下所示。您会看到它类似于 Inner Join 语法,但添加了LEFT关键字。

SELECT columns
  FROM table1
  LEFT JOIN table2
  ON relation;
左外连接

SQL 中的右外部联接

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

您可以用带有两个圆圈的维恩图来想象它,结果表是绿色突出显示的部分,其中包括重叠部分和右侧圆圈的其余部分。

带有重叠部分的两个圆圈。 左圈标记为表 1,右圈标记为表 2。叠加部分和表 2 圈的其余部分为绿色。
右外连接的维恩图表示

语法如下,唯一的区别是RIGHT关键字。

SELECT columns
  FROM table1
  RIGHT JOIN table2
  ON relation;
右外连接

SQL 中的完全外部联接

您可以将 FULL OUTER JOIN 视为左连接和右连接的组合。它将保留两个表中的所有行,缺失的数据将用NULL.

您可以用带有两个圆圈的维恩图来想象它,结果表是绿色突出显示的部分,其中包括所有内容:重叠部分、左圆和右圆。

带有重叠部分的两个圆圈。 左边的圆圈被标记为表 1,右边的圆圈被标记为表 2。一切都以绿色着色。
完全外连接的维恩图表示

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

SELECT columns
  FROM table1
  FULL JOIN table2
  ON relation;
全外连接

SQL JOIN 运算符示例

兽医诊所可能的数据库可以有一张用于宠物的表和一张用于主人的表。由于一个所有者可能有多个宠物,因此 pets 表将有一owner_id列指向所有者表。

身份证姓名年龄所有者_ID
1菲多71
2小姐31
3娘娘腔102
413
5料斗20
身份证姓名电话号码
1约翰尼4567823
2奥利7486513
3伊莱尼亚3481365
4路易丝1685364

您可以使用简单的查询来获取一个带有彼此相邻的宠物名称和所有者名称的表。让我们用所有不同的 JOIN 运算符来做。

SQL 内部联接示例

让我们首先使用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​。

最后,当需要加入的两列一一对应时,使用ON关键字将pets表的owner_id与owners表的id使用等号连接起来: ​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 右连接示例

如果您使用 using 执行相同的查询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。

宠物名称所有者
菲多约翰尼
小姐约翰尼
娘娘腔奥利
伊莱尼亚
路易丝

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

SQL 全连接示例

您可以再次执行相同的查询,使用FULL JOIN.

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

结果表再次不同——在这种情况下,两个表中的所有行都被保留。

宠物名称所有者
菲多约翰尼
小姐约翰尼
娘娘腔奥利
伊莱尼亚
料斗
路易丝

在我们的数据库中似乎有没有主人的宠物和没有宠物的主人。

结论

在关系数据库中,所有数据都应该只写入一次。然后要分析这些数据,您需要将相关数据连接在一起。

以上就是关于sql连接的全部内容了,更多sql的学习知识可以关注W3Cschool