“INNER JOIN”和“OUTER JOIN”有什么区别?

新手上路,请多包涵

另外,如何 LEFT OUTER JOINRIGHT OUTER JOINFULL OUTER JOIN 适合?

原文由 Chris de Vries 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 423
2 个回答

假设您要加入没有重复的列,这是一种非常常见的情况:

  • A 和 B 的内连接给出了 A 相交 B 的结果,即 维恩图 相交的内部部分。

  • A 和 B 的外连接给出了 A 联合 B 的结果,即 维恩图 联合的外部部分。

例子

假设您有两个表,每个表都有一个列,数据如下:

 A    B
-    -
1    3
2    4
3    5
4    6

请注意,(1,2) 是 A 独有的,(3,4) 是常见的,(5,6) 是 B 独有的。

内部联接

使用任一等效查询的内连接给出了两个表的交集,即它们共有的两行。

 select * from a INNER JOIN b on a.a = b.b;
select a.*, b.*  from a,b where a.a = b.b;

a | b
--+--
3 | 3
4 | 4

左外连接

左外连接将给出 A 中的所有行,以及 B 中的任何公共行。

 select * from a LEFT OUTER JOIN b on a.a = b.b;
select a.*, b.*  from a,b where a.a = b.b(+);

a |  b
--+-----
1 | null
2 | null
3 |    3
4 |    4

右外连接

右外连接将给出 B 中的所有行,以及 A 中的任何公共行。

 select * from a RIGHT OUTER JOIN b on a.a = b.b;
select a.*, b.*  from a,b where a.a(+) = b.b;

a    |  b
-----+----
3    |  3
4    |  4
null |  5
null |  6

全外连接

全外连接将为您提供 A 和 B 的并集,即 A 中的所有行和 B 中的所有行。如果 A 中的某些内容在 B 中没有对应的数据,则 B 部分为空,反之亦然反之亦然。

 select * from a FULL OUTER JOIN b on a.a = b.b;

 a   |  b
-----+-----
   1 | null
   2 | null
   3 |    3
   4 |    4
null |    6
null |    5

原文由 Mark Harrison 发布,翻译遵循 CC BY-SA 4.0 许可协议

通过一个示例可以更轻松地解释连接:

在此处输入图像描述

要模拟存储在不同表中的人员和电子邮件,

表 A 和表 B 由 Table_A 连接。 id = 表_B。 name_id

内部联接

在此处输入图像描述

仅显示匹配的 ID 行。

外连接

在此处输入图像描述

显示了 表 A 的匹配 ID 和不匹配行。

在此处输入图像描述

显示了 表 B 的匹配 ID 和不匹配行。

在此处输入图像描述 显示了两个表中匹配的 id 和不匹配的行。

注意:完全外连接在 MySQL 上不可用

原文由 HGG-Dev 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进