" INNER JOIN"和" OUTER JOIN"有什么区别?

时间:2020-03-05 18:46:09  来源:igfitidea点击:

还有"左联接","右联接"和"全联接"如何配合?

解决方案

回答

内部联接仅在联接的另一侧(右侧)上有匹配记录时才显示行。

(左)外部联接在左侧显示每个记录的行,即使联接的另一(右侧)没有匹配的行。如果没有匹配的行,则另一(右侧)列将显示NULL。

回答

内部联接要求联接表中存在具有相关ID的记录。

即使右侧没有任何内容,外部联接也将返回左侧的记录。

例如,我们有一个Orders和一个OrderDetails表。它们通过" OrderID"关联。

命令

  • 订单编号
  • 顾客姓名

订单详细信息

  • OrderDetailID
  • 订单编号
  • 产品名称
  • 数量
  • 价格

要求

SELECT Orders.OrderID, Orders.CustomerName FROM Orders 
INNER JOIN OrderDetails ON Orders.OrderID = OrderDetails.OrderID

将仅返回在OrderDetails表中也包含某些内容的订单。

如果将其更改为OUTER LEFT JOIN

SELECT Orders.OrderID, Orders.CustomerName FROM Orders 
LEFT JOIN OrderDetails ON Orders.OrderID = OrderDetails.OrderID

那么它将从Orders表返回记录,即使它们没有OrderDetails记录也是如此。

我们可以通过添加诸如WHERE OrderDetails.OrderID IS NULL之类的where子句来查找没有指示可能孤立订单的OrderDetails的Order。

回答

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

  • 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

回答

我推荐杰夫的博客文章。我见过的最好的描述,外加可视化效果,例如:

内部联接:

完全外部加入:

回答

" INNER JOIN"要求在比较两个表时至少要有一个匹配项。例如,表A和表B表示A? B(路口B)。

LEFT OUTER JOINLEFT JOIN相同。它提供了两个表中都匹配的所有记录以及左侧表的所有可能性。

同样," RIGHT OUTER JOIN"和" RIGHT JOIN"相同。它提供了两个表中都匹配的所有记录以及右表的所有可能性。

" FULL JOIN"是" LEFT OUTER JOIN"和" RIGHT OUTER JOIN"的组合,没有重复。