" INNER JOIN"和" OUTER JOIN"有什么区别?
还有"左联接","右联接"和"全联接"如何配合?
解决方案
回答
内部联接仅在联接的另一侧(右侧)上有匹配记录时才显示行。
(左)外部联接在左侧显示每个记录的行,即使联接的另一(右侧)没有匹配的行。如果没有匹配的行,则另一(右侧)列将显示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 JOIN
和LEFT JOIN
相同。它提供了两个表中都匹配的所有记录以及左侧表的所有可能性。
同样," RIGHT OUTER JOIN"和" RIGHT JOIN"相同。它提供了两个表中都匹配的所有记录以及右表的所有可能性。
" FULL JOIN"是" LEFT OUTER JOIN"和" RIGHT OUTER JOIN"的组合,没有重复。