1. 程式人生 > >Mysql之連線查詢(交叉連線,內連線,外連線,using關鍵字使用場景)

Mysql之連線查詢(交叉連線,內連線,外連線,using關鍵字使用場景)

連線查詢

連線查詢:將多張表連到一起進行查詢(會導致記錄數行和欄位數列發生改變)

連線查詢的意義

在關係型資料庫設計過程中,實體(表)與實體之間是存在很多聯絡的。在關係型資料庫表的設計過程中,遵循著關係來設計:一對一,一對多和多對多,通常在實際操作的過程中,需要利用這層關係來保證資料的完整性。

連線查詢分類

連線查詢一共有以下幾類:

交叉連線

內連線

外連線:左外連線(左連線)和右外連線(右連線)

自然連線

交叉連線

交叉連線:將兩張表的資料與另外一張表彼此交叉

原理

1、 從第一張表依次取出每一條記錄

2、 取出每一條記錄之後,與另外一張表的全部記錄挨個匹配

3、 沒有任何匹配條件,所有的結果都會進行保留

4、 記錄數 = 第一張表記錄數 * 第二張表記錄數;欄位數 = 第一張表字段數  + 第二張表字段數(笛卡爾積)

語法

基本語法:表1 cross join 表2;

應用

交叉連線產生的結果是笛卡爾積,沒有實際應用。

內連線

內連線:inner join,從一張表中取出所有的記錄去另外一張表中匹配:利用匹配條件進行匹配,成功了則保留,失敗了放棄。

原理

1、 從第一張表中取出一條記錄,然後去另外一張表中進行匹配

2、 利用匹配條件進行匹配:

2.1 匹配到:保留,繼續向下匹配

2.2 匹配失敗:向下繼續,如果全表匹配失敗,結束

語法

基本語法:表1 [inner] join 表2 on 匹配條件;

1、 如果內連線沒有條件(允許),那麼其實就是交叉連線(避免)

2、 使用匹配條件進行匹配

3、 因為表的設計通常容易產生同名欄位,尤其是ID,所以為了避免重名出現錯誤,通常使用表名.欄位名,來確保唯一性

4、 通常,如果條件中使用到對應的表名,而表名通常比較長,所以可以通過表別名來簡化

5、 內連線匹配的時候,必須保證匹配到才會儲存

6、 內連線因為不強制必須使用匹配條件(on)因此可以在資料匹配完成之後,使用where條件來限制,效果與on一樣(建議使用on)

應用

內連線通常是在對資料有精確要求的地方使用:必須保證兩種表中都能進行資料匹配。

外連線

外連結:outer join,按照某一張表作為主表(表中所有記錄在最後都會保留),根據條件去連線另外一張表,從而得到目標資料。

外連線分為兩種:左外連線(left join),右外連線(right join)

左連線:左表是主表

右連線:右表是主表

原理

1、 確定連線主表:左連線就是left join左邊的表為主表;right join就是右邊為主表

2、 拿主表的每一條記錄,去匹配另外一張表(從表)的每一條記錄

3、 如果滿足匹配條件:保留;不滿足即不保留

4、 如果主表記錄在從表中一條都沒有匹配成功,那麼也要保留該記錄:從表對應的欄位值都未NULL

語法

基本語法:

左連線:主表 left join 從表 on 連線條件;

右連線:從表 right join 主表 on連線條件;

左連線對應的主表資料在左邊;右連線對應的主表資料在右邊:

特點

1、 外連線中主表資料記錄一定會儲存:連線之後不會出現記錄數少於主表(內連線可能)

2、 左連線和右連線其實可以互相轉換,但是資料對應的位置(表順序)會改變

應用

非常常用的一種獲取的資料方式:作為資料獲取對應主表以及其他資料(關聯)

Using關鍵字

是在連線查詢中用來代替對應的on關鍵字的,進行條件匹配。

原理

1、 在連線查詢時,使用on的地方用using代替

2、 使用using的前提是對應的兩張表連線的欄位是同名(類似自然連線自動匹配)

3、 如果使用using關鍵字,那麼對應的同名欄位,最終在結果中只會保留一個。

語法

基本語法:表1 [inner,left,right] join 表2 using(同名欄位列表); //連線欄位

總結:應避免使用交叉連線,看情況使用內連線或者外連線,當要以一表資料為主,使得查詢的記錄數不會少於此表記錄數時考慮外連線,當嚴格按照條件進行匹配時,使用內連線比較合適,當兩表條件欄位名一致時,可以使用using關鍵字。