換個角度看錶鏈接

外鏈接的基礎概念

標準SQL裏定義了外鏈接的三種類型,以下:sql

  • 左外鏈接「LEFT OUTER JOIN」
  • 右外鏈接「RIGHT OUTER JOIN」
  • 全外鏈接「FULL OUTER JOIN」

在這三種中,左外鏈接和右外鏈接功能上沒有什麼區別,咱們都比較熟悉,全外鏈接相對來講使用較少。數據庫

咱們使用具體的實例說明,橘子、蘋果同時屬於兩張表,而香蕉和菠蘿分別只屬於一張表。微信

imgimg

(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;

img

(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;

img

(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」

img

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;

img

並集

全外鏈接至關於求集合的和 「UNION」

img

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;

img

差集

觀察前面的全外鏈接結果集,咱們能夠發現,香蕉在表 BasketA 裏存在而在表 BasketB 裏不存在,「Bname」列是 NULL;相反,菠蘿在表 BasketB 裏存在而在表 BasketA 裏不存在,「Aname」列是 NULL。因此,咱們能夠經過錶鏈接後的某些字段是否爲NULL來求得差集。

用外鏈接求差集「A - B」

img

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;

img

用外鏈接求差集「B - A」

img

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;

img

異或集

求兩個集合的異或集有兩種辦法:

(1) ( A UNION B )- ( A INTERSECT B)

(2) ( A -B ) UNION ( B - A )

用全外鏈接求異或集

img

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;

img


SQL是以「集合論」爲基礎的,不管是表仍是視圖,本質上都是集合——集合是SQL惟一能處理的數據結構。從行數來看,錶鏈接能夠看作是表的乘法。使用鏈接即可以實現各類集合運算。

做者:CoderFocus

微信公衆號:

聲明:本文爲博主學習感悟總結,水平有限,若是不當,歡迎指正。若是您認爲還不錯,不妨點擊一下下方的推薦按鈕,謝謝支持。轉載與引用請註明做者及出處。

相關文章
相關標籤/搜索