標籤:round 關係 bsp img 思路 image nbsp 通過 多表串連
每個實體,一個表
當一個業務需要多個實體的資料,顯然需要多張表在一起使用,即將多張表的記錄串連起來。
1. 總體思路:
先將所有資料按照某種條件,串連起來,再進行篩選處理。
2. 分類方式:
根據串連的條件不同,分為一下幾類:
① 內串連(Inner):要求串連的多個資料都必須存在,才能進行串連。
【舉個栗子】如下三張表,分別記錄了老師的資訊,班級資訊,以及老師們的代課情況。
此時,若想獲得所有老師的代課資訊,‘韓信’在表3中有與之配對的記錄(內串連)
但發現孫武沒有帶過課,即表1中的‘孫武’在表3中沒有與之配對的記錄(外串連)。
表1. 所有老師的資訊 表2. 所有班級的資訊
表3. 老師們的代課情況
【文法】tbl_left inner join tbl_right on 串連條件;
【舉個栗子】求表1中的所有老師的開始代課時間、代課天數。
tip : 內串連可以省略串連條件,意味著所有左表的資料都要與右表的記錄做一次串連(交叉串連or笛卡爾積串連)。
此時可以使用cross join代替inner join。
實際上,可以使用多表查詢的方式,不實用where,做到笛卡爾積。
在MySQL中,inner join是預設的串連方式,可以省略inner。
【寫法】1) on(寫法如上一個例子)。
2) where(只需把on替換成where即可)。
結果一樣,但是邏輯關係不同:where會先形成包含所有串連的笛卡爾積,再在這些資料中進行過濾;
on 會先進行滿足條件的資料過濾,在對過濾後的資料進行串連。
【using】當有同名欄位時,可以使用 using (欄位名),進行條件約束。
【as】給表、欄位起別名,可以把比較長的表名改成比較短的別名,保證簡潔、清晰。
② 外串連(outer):負責串連的資料有一個或多個不存在
【文法】tbl_name left outer join tbl_name on 串連條件;(也可以使用using,不使用where!!)
tip : 必須要有串連條件!!(內串連沒有條件=笛卡爾積,但是外串連必須有)
1) 左外串連;(left outer join)
左串連時,若左表的資料連線不到右表的情況,則左表的資料在最終結果中被保留
(如,左表中的‘孫武’沒有串連到右表的資料,但是‘孫武’在最終資料中保留了下來);
若右表資料連線不到左表,則最終結果中,右表資料被丟棄(如,交換兩表的左右順序,發現右表的‘孫武’被丟棄)。
2) 右外串連;
3) 全外串連(MySQL不支援);
(左串連)union(右串連);
③ 自然串連(natural):通過 MySQL 自己的判斷完成串連過程,無需指明串連條件。
MySQL 使用多表內相同的欄位,作為串連條件。
【文法】 (表1) natural join (表2); ----內
natural left join ----- 左外
natural right join --- 右外
3. 多表串連
MySQL:串連查詢