標準SQL裏定義了外鏈接的三種類型,以下:sql
在這三種中,左外鏈接和右外鏈接功能上沒有什麼區別,咱們都比較熟悉,全外鏈接相對來講使用較少。數據庫
咱們使用具體的實例說明,橘子、蘋果同時屬於兩張表,而香蕉和菠蘿分別只屬於一張表。微信
(1)左外鏈接「LEFT OUTER JOIN」數據結構
左外鏈接是從兩張內容不一致的表裏確保獲取左表所有數據post
SELECT A.id,A. NAME AS A_name,B. NAME AS B_name FROM Basket_A A LEFT OUTER JOIN Basket_B B ON A.id = B.id;
(2)右外鏈接「RIGHT OUTER JOIN」學習
右外鏈接是從兩張內容不一致的表裏確保獲取右表所有數據spa
SELECT B.id,A. NAME AS A_name,B. NAME AS B_name FROM Basket_A A RIGHT OUTER JOIN Basket_B B ON A.id = B.id;
(3)全外鏈接「FULL OUTER JOIN」3d
全外鏈接是從兩張內容不一致的表裏獲取左右表所有數據,至關於左右表都是主表code
SELECT A. NAME AS A_name,B. NAME AS B_name FROM Basket_A A FULL OUTER JOIN Basket_B B ON A.id = B.id;
個別數據庫不支持全外鏈接,能夠分別進行左外鏈接和右外鏈接,再用 UNION 將兩個結果集合並起來。blog
-- 使用UNION合併左外鏈接和右外鏈接代替全外鏈接 SELECT A.id,A. NAME AS A_name,B. NAME AS B_name FROM Basket_A A LEFT OUTER JOIN Basket_B B ON A.id = B.id UNION SELECT B.id,A. NAME AS A_name,B. NAME AS B_name FROM Basket_A A RIGHT OUTER JOIN Basket_B B ON A.id = B.id;
SQL是以「集合論」爲基礎的,咱們能夠換個角度,把「表」當作「集合」,把「錶鏈接」當作「集合運算」。
內鏈接至關於求集合的積 「INTERSECT」
SELECT A. id,A. NAME AS A_name,B. NAME AS B_name FROM Basket_A A INNER JOIN Basket_B B ON A.id = B.id;
全外鏈接至關於求集合的和 「UNION」
SELECT A.id,A. NAME AS A_name,B. NAME AS B_name FROM Basket_A A LEFT OUTER JOIN Basket_B B ON A.id = B.id UNION SELECT B.id,A. NAME AS A_name,B. NAME AS B_name FROM Basket_A A RIGHT OUTER JOIN Basket_B B ON A.id = B.id;
觀察前面的全外鏈接結果集,咱們能夠發現,香蕉在表 BasketA 裏存在而在表 BasketB 裏不存在,「Bname」列是 NULL;相反,菠蘿在表 BasketB 裏存在而在表 BasketA 裏不存在,「Aname」列是 NULL。因此,咱們能夠經過錶鏈接後的某些字段是否爲NULL來求得差集。
用外鏈接求差集「A - B」
SELECT A.id,A. NAME AS A_name,B. NAME AS B_name FROM Basket_A A LEFT OUTER JOIN Basket_B B ON A.id = B.id WHERE B. NAME IS NULL;
用外鏈接求差集「B - A」
SELECT B.id,A. NAME AS A_name,B. NAME AS B_name FROM Basket_A A RIGHT OUTER JOIN Basket_B B ON A.id = B.id WHERE A. NAME IS NULL;
求兩個集合的異或集有兩種辦法:
(1) ( A UNION B )- ( A INTERSECT B)
(2) ( A -B ) UNION ( B - A )
用全外鏈接求異或集
SELECT A. NAME AS A_name,B. NAME AS B_name FROM Basket_A A FULL OUTER JOIN Basket_B B ON A.id = B.id WHERE A. NAME IS NULL OR B. NAME IS NULL;
SQL是以「集合論」爲基礎的,不管是表仍是視圖,本質上都是集合——集合是SQL惟一能處理的數據結構。從行數來看,錶鏈接能夠看作是表的乘法。使用鏈接即可以實現各類集合運算。