另外,"LEFT JOIN"、"RIGHT JOIN "和 "FULL JOIN "是如何实现的?
假设你是在没有重复的列上进行连接,这是很常见的情况。
A和B的内部连接给出了A与B相交的结果,即Venn图相交的内部部分。
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
内联接只在联接的另一边(右边)有匹配的记录时才显示行。
一个(左)外连接显示左手边的每一条记录的行,即使在连接的另一边(右)没有匹配的行。如果没有匹配的记录,另一边(右边)的列会显示NULL。
内联要求在联接的表中存在一个具有相关ID的记录。
外连接将返回左边的记录,即使右边的记录不存在。
例如,你有一个Orders表和一个OrderDetails表。它们通过一个"OrderID"联系起来。
Orders
订单细节
请求
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
那么它将从订单表中返回记录,即使它们没有OrderDetails记录。
你可以通过添加一个where子句,如 "WHERE OrderDetails.OrderID IS NULL",来找到没有任何OrderDetails的订单,这表明可能有一个无主的订单。