1. 程式人生 > >史上最簡單的 MySQL 教程(二十四)「連線查詢」

史上最簡單的 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

01

實際上,笛卡爾積形式(交叉連線和多表查詢)的結果並沒有什麼實際意義,應該儘量避免,其存在的價值就是保證連線這種結構的完整性。

內連線

內連線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

innerjoin

在這裡,值得注意的是:如果兩表中有某個表的條件欄位名唯一,那麼在書寫連線條件的時候,可以省略表名,直接書寫欄位名,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

alias

最後,內連線可以沒有連線條件,即可以沒有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

onon 
whereon

溫馨提示:符號[]括起來的內容,表示可選項;符號+,則表示連線的意思。

外連線

外連線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

outer

實際上,無論以那張表為主表,其外連線的結果(記錄數量)都不會少於主表的記錄總數。此外,雖然左連線與右連線有主表差異,但顯示的結果都是:左表的資料在左邊,右表的資料在右邊

自然連線

自然連線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

natural

觀察上圖,咱們會發現:自然連線自動使用同名欄位作為連線條件,而且在連線完成之後合併同名欄位

自然外連線

  • 基本語法左表 + 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

naturalwai

實際上,自然連線並不常用。而且,咱們可以用內連線和外連線來模擬自然連線,模擬的關鍵就在於使用同名欄位作為連線條件及合併同名欄位。

  • 基本語法左表 + 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

moni

溫馨提示:符號[]括起來的內容,表示可選項;符號+,則表示連線的意思。