多表操作之列關聯(二)

本文標識 : MQ0014

本文編輯 : 長安月下賞美人兒

編程工具 : MySQL、DBeaver

閱讀時長 : 8分鐘

目錄

前言

外連接分類

左連接

全連接

前言

上周和小夥伴兒們一起分享了《多表操作之列關聯(一)》,主要涉及到交叉連接和內連接,此篇則詳細介紹外連接的相關資訊。也許會有困惑,為啥單獨介紹外連接,是因為其骨骼驚奇么?!小編在此鄭重聲明,之所以單獨介紹外連接,主要是因為其特別有趣,特別精彩,尤其是裡面的左連接更是在日常工作中被頻繁翻牌子!

外連接分類

外連接根據連接方式的不同,分為兩種類。其中,左連接和右連接,原理一致,但也分兩種不同的情況,全連接亦然如此。具體類別如下圖所示。

  • 左連接、右連接
  • 全連接

圖示所示:

左連接

左連接與右連接原理一致,故搞懂左連接兩種不同場景,也將順利解鎖右連接的奧秘。

LEFT JOIN:以左表為主表,通過相同意義的欄位與右表連接,返回左表的全部數據行,以及右表中匹配的記錄,如果右表中沒有匹配,則用欄位 NULL 來填充。聽起來很簡單有沒有?!但是,事情的經過並不是這個樣子的,實踐是檢驗真理的唯一標準,實際操作過程中的坑坑窪窪在所難免。

場景一:LEFT JOIN 包含兩表交集

# LEFT JOIN 場景一基礎語法:  SELECT <select_list>  FROM TableA A  LEFT JOIN TableB B  ON A.Key = B.Key;

在左連接場景一中,根據兩表連接關鍵字的不同,又細分為3種情況。

1、一對一

通俗的講,A 表與 B 表連接的關鍵字內的資訊值,兩者一一對應。即 A.Key 中的資訊,在 B.Key 中有且僅有唯一對應值。譬如,前者裡面有 1 ,後者裡面有且僅有一個 1 。

數據背景:數據表 t1 ,數據表 t2

SELECT * FROM t1 A  LEFT JOIN t2 B  ON A.id=B.id;

數據結果:

2、一對多

通俗的講,A 表與 B 表連接的關鍵字內的資訊值,前者關鍵字內資訊值各自獨立,後者關鍵字內資訊值出現多個重複值。即 A.Key 中的資訊,在 B.Key 中有多個對應值。譬如,前者裡面有 1 ,後者裡面有 2 個 1 。

數據背景:數據表 t1 ,數據表 t2

SELECT * FROM t1 A  LEFT JOIN t2 B  ON A.id=B.id;

數據結果:

邏輯解析:

(1)數據表 t1 中,有 4 條數據,且 id 各自獨立;

(2)數據表 t2 中,有 4 條數據,但 id=2 的數據有 2 條;

(3)當 id=2 的時候,在表 t2 中有 2 條滿足和表 t1 中 id=2 進行匹配;

(4)故,返回的結果是 5 條,其中 2 條數據 id=2。

3、多對多

通俗的講,A 表與 B 表連接的關鍵字內的資訊值,前者與後者關鍵字內資訊值出現多個重複值。即 A.Key 中有重複資訊,在 B.Key 中有多個對應值。譬如,前者裡面有 2 個 1 ,後者裡面有 2 個 1 。

數據背景:數據表 t1 ,數據表 t2

SELECT * FROM t1 A  LEFT JOIN t2 B  ON A.id=B.id;

數據結果:

邏輯解析:

(1)數據表 t1 中,有 6 條數據,且 id=1、id=2 各有 2 條數據;

(2)數據表 t2 中,有 7 條數據,且 id=1、id=2 各有 2 條數據;

(3)當 id=1 ,name=『大毛』 的時候,在表 t2 中有 2 條滿足和表 t1 中 id=2 進行匹配,以此類推;

(4)故,返回的結果是 10 條,其中 id=1、id=2 各有 4 條數據。

場景二:LEFT JOIN 不包含兩表交集

# LEFT JOIN 場景二基礎語法:  SELECT <select_list>  FROM TableA A  LEFT JOIN TableB B  ON A.Key = B.Key  WHERE  B.Key IS NULL;

數據背景:數據表 t1 ,數據表 t2

#例1  SELECT * FROM t1 A  LEFT JOIN t2 B  ON A.id=B.id  WHERE B.id IS NULL;

數據結果:

#例2  SELECT * FROM t1 A  LEFT JOIN t2 B  ON A.name=B.name  WHERE B.name IS NULL;

數據結果:

左連接小結:

  • 在進行多表連接之前,查看清楚連接的關鍵字是否唯一,如果不唯一,則要考慮清楚選擇哪個欄位作為關鍵字
  • 在留存交集的情況下,考慮清楚三種不同的連接情況,確定想要的數據模式
  • 如果想對右表進行限制,則一定要在 on 條件中進行
  • 如果想對連接之後的數據進行過濾,則一定要在 where 條件中進行
  • 如果沒有 where 條件,無論 on 條件對兩表怎麼限制,左表的每一行至少會有一行的合成結果

全連接

全連接,就是將要連接的各表的所有資訊進行融合。簡單粗暴的講,就是取並集,用數學符號表示就是 集合A ∪ 集合 B

場景一:FULL OUTER JOIN 包含兩表交集

# FULL  OUTER JOIN 場景一基礎語法:  SELECT <select_list> FROM TableA A  LEFT JOIN TableB B  ON A.Key = B.Key  WHERE <限制條件>  UNION  SELECT <select_list> FROM TableA A  RIGHT JOIN TableB B  ON A.Key = B.Key  WHERE <限制條件>;

數據背景:數據表 t1 ,數據表 t2

SELECT * FROM t1  LEFT JOIN t2  ON t1.name=t2.name  UNION  SELECT * FROM t1  RIGHT JOIN t2  ON t1.name=t2.name;

數據結果:

注意:如果直接關聯兩表會如何?

(還記得之前學習的行關聯么?!)

SELECT*FROM t1  UNION  SELECT * FROM t2;

數據結果:

場景二:FULL OUTER JOIN 不包含兩表交集

# FULL OUTER JOIN 場景二基礎語法:  SELECT <select_list> FROM TableA A  LEFT JOIN TableB B  ON B.Key IS NULL  UNION  SELECT <select_list> FROM TableA A  RIGHT JOIN TableB B  ON A.Key IS NULL;

數據背景:數據表 t1 ,數據表 t2

SELECT * FROM t1  LEFT JOIN t2  ON t1.name=t2.name  WHERE t2.name IS NULL  UNION  SELECT * FROM t1  RIGHT JOIN t2  ON t1.name=t2.name  WHERE t1.name IS NULL;

數據結果:

邏輯解析:

(1)數據表 t1 與 t2 中,以 name 為連接關鍵詞,重複的數據有『二毛』、『小明』;

(2)兩數據表左連接,且不包含交集

(3)兩數據表右連接,且不包含交集

(4)對查詢結果關聯即可得到結果

全連接小結:

  • 進行數據表全連接的同時,要注意是否包含交集

注意:關於全連接,有的資料顯示,可以直接用 FULL OUTER JOIN 句式,但小編在 DBeaver 中嘗試失敗,感興趣的小夥伴兒可以去嘗試一下。

# FULL OUTER JOIN 場景一基礎語法:  SELECT <select_list> FROM TableA A  FULL OUTER JOIN TableB B  ON A.Key=B.Key;    # FULL OUTER JOIN 場景二基礎語法:  SELECT <select_list> FROM TableA A  FULL OUTER JOIN TableB B  WHERE A.Key IS NULL  OR B.Key IS NULL

Tags: