史上最簡單的 MySQL 教程(二十四)「連線查詢」
連線查詢
連線查詢:將多張表(大於等於 2 張表)按照某個指定的條件進行資料的拼接,其最終結果記錄數可能有變化,但欄位數一定會增加。
連線查詢的意義:在使用者查詢資料的時候,需要顯示的資料來自多張表。
連線查詢為join
,使用方式為:左表join
右表。
- 左表:
join
左邊的表; - 右表:
join
右邊的表。
連線查詢分類:在 SQL 中將連線查詢分為四類,分別為內連線、外連結、自然連線和交叉連線。
交叉連線
交叉連線:cross join
,從一張表中迴圈取出每一條記錄,每條記錄都去另外一張表進行匹配,匹配的結果都保留(沒有條件匹配),而連線本身的欄位會增加,最終形成的結果為笛卡爾積形式。
- 基本語法:
左表 cross join 右邊;
其結果與多表查詢相同。
執行如下 SQL 語句,進行測試:
-- 將表 student 與 class 進行交叉連線
select * from student cross join class;
-- 將表 student 與 class 進行多表查詢
select * from student,class;
- 1
- 2
- 3
- 4
實際上,笛卡爾積形式(交叉連線和多表查詢)的結果並沒有什麼實際意義,應該儘量避免,其存在的價值就是保證連線這種結構的完整性。
內連線
內連線:inner join
,從左表中取出每一條記錄,和右表中的所有記錄進行匹配,並且僅當某個條件在左表和右表中的值相同時,結果才會保留,否則不保留。
- 基本語法
左表 + [inner] + join + 右表 + on + 左表.欄位 = 右表.欄位;
其中,關鍵字on
表示連線條件,兩表中的條件欄位有著相同的業務含義。
執行如下 SQL 語句,進行測試:
-- 將表 student 與 class 進行內連線
select * from student inner join class on student.grade = class.grade;
select * from student join class on student.grade = class.grade;
- 1
- 2
- 3
在這裡,值得注意的是:如果兩表中有某個表的條件欄位名唯一,那麼在書寫連線條件的時候,可以省略表名,直接書寫欄位名,MySQL 會自動識別唯一欄位名,但不建議這麼做
執行如下 SQL 語句,進行測試:
-- 將表 student 與 class 進行內連線,起別名
select s.*,c.id as c_id,c.grade as c_grade,room from student as s inner join class as c on s.grade = c.grade;
- 1
- 2
最後,內連線可以沒有連線條件,即可以沒有on
及之後的內容,這時內連線的結果全部保留,與交叉連線的結果完全相同。而且在內連線的時候可以使用where
關鍵字代替on
,但不建議這麼做,因為where
沒有on
的效率高。
執行如下 SQL 語句,進行測試:
-- 將表 student 與 class 進行內連線,不加連線條件
select s.*,c.id as c_id,c.grade as c_grade,room from student as s inner join class as c;
-- 將表 student 與 class 進行交叉連線
select s.*,c.id as c_id,c.grade as c_grade,room from student as s cross join class as c;
-- 使用 on 關鍵字進行內連線
select s.*,c.id as c_id,c.grade as c_grade,room from student as s inner join class as c on s.grade = c.grade;
-- 使用 where 關鍵字進行內連線
select s.*,c.id as c_id,c.grade as c_grade,room from student as s inner join class as c where s.grade = c.grade;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
溫馨提示:符號[]
括起來的內容,表示可選項;符號+
,則表示連線的意思。
外連線
外連線:left\right join
,以某張表為主表,取出裡面的所有記錄,然後讓主表中的每條記錄都與另外一張表進行連線,不管能否匹配成功,其最終結果都會保留,匹配成功,則正確保留;匹配失敗,則將另外一張表的欄位都置為NULL
.
- 基本語法:
左表 + left\right + join + 右表 + on + 左表.欄位 = 右表.欄位;
其中,關鍵字on
表示連線條件,兩表中的條件欄位有著相同的業務含義。在這裡,以主表為依據,外連線分為兩種,分別為:
left join
:左外連線(左連線),以左表為主表;right join
:右外連線(右連線),以右表為主表。
執行如下 SQL 語句,進行測試:
-- 將表 student 與 class 進行左連線
select s.*,c.id as c_id,c.grade as c_grade,room from student as s left join class as c on s.grade = c.grade;
-- 將表 student 與 class 進行右連線
select s.*,c.id as c_id,c.grade as c_grade,room from student as s right join class as c on s.grade = c.grade;
- 1
- 2
- 3
- 4
- 5
實際上,無論以那張表為主表,其外連線的結果(記錄數量)都不會少於主表的記錄總數。此外,雖然左連線與右連線有主表差異,但顯示的結果都是:左表的資料在左邊,右表的資料在右邊。
自然連線
自然連線:nature join
,自然連線其實就是自動匹配連線條件,系統以兩表中同名欄位作為匹配條件,如果兩表有多個同名欄位,那就都作為匹配條件。在這裡,自然連線可以分為自然內連線和自然外連線。
自然內連線
- 基本語法:
左表 + nature + join + 右表;
執行如下 SQL 語句,進行測試:
-- 將表 student 與 class 進行自然內連線
select * from student natural join class;
-- 將表 student 與 class 進行內連線,連線條件為 id 和 grade
select * from student inner join class on student.id = class.id and student.grade = class.grade;
- 1
- 2
- 3
- 4
- 5
觀察上圖,咱們會發現:自然連線自動使用同名欄位作為連線條件,而且在連線完成之後合併同名欄位。
自然外連線
- 基本語法:
左表 + nature + left/right + join + 右表;
執行如下 SQL 語句,進行測試:
-- 將表 student 與 class 進行自然左外連線
select * from student natural left join class;
-- 將表 student 與 class 進行自然右外連線
select * from student natural right join class;
- 1
- 2
- 3
- 4
- 5
實際上,自然連線並不常用。而且,咱們可以用內連線和外連線來模擬自然連線,模擬的關鍵就在於使用同名欄位作為連線條件及合併同名欄位。
- 基本語法:
左表 + inner/left/right + join + 右表 + using(欄位名);
其中,using
內部的欄位名就是作為連線條件的欄位,也是需要合併的同名欄位。
執行如下 SQL 語句,進行測試:
-- 將表 student 與 class 進行自然左外連線
select * from student natural left join class;
-- 用左外連線模擬自然左外連線
select * from student left join class using(id,grade);
- 1
- 2
- 3
- 4
- 5
溫馨提示:符號[]
括起來的內容,表示可選項;符號+
,則表示連線的意思。