一.內聯結、外聯結、左聯結、右聯結的含義及區別
在SQL標準中規劃的(Join)聯結大致分爲下面四種:
1.內聯結:將兩個表中存在聯結關係的字段符合聯結關係的那些記錄形成記錄集的聯結。
2.外聯結:分爲外左聯結和外右聯結。
左聯結A、B表的意思就是將表A中的全部記錄和表B中聯結的字段與表A的聯結字段符合聯結條件的那些記錄形成的記錄集的聯結,這裏注意的是最後出來的記錄集會包括表A的全部記錄。
右聯結A、B表的結果和左聯結B、A的結果是一樣的,也就是說:
- Select A.name B.name From A Left Join B On A.id=B.id
- Select A.name B.name From B Right Join A on B.id=A.id
3.全聯結:將兩個表中存在聯結關係的字段的所有記錄取出形成記錄集的聯結。
4.無聯結:沒有使用聯結功能,也有自聯結的說法。
內外聯結的區別是內聯結將去除所有不符合條件的記錄,而外聯結則保留其中部分。外左聯結與外右聯結的區別在於如果用A左聯 結B則A中所有記錄都會保留在結果中,此時B中只有符合聯結條件的記錄,而右聯結相反。
二.例子
假設有如下兩張表:
ID | Name |
1 | Tiim |
2 | Jimmy |
3 | John |
4 | Tom |
ID | Hobby |
1 | Football |
2 | Basketball |
2 | Tennis |
4 | Soccer |
1內聯結:
- Select A.Name B.Hobby from A, B where A.id = B.id
Name | Hobby |
Tim | Football |
Jimmy | Basketball |
Jimmy | Tennis |
Tom | Soccer |
- Select A.Name from A INNER JOIN B ON A.id = B.id
2.外左聯結
- Select A.Name from A Left JOIN B ON A.id = B.id
Name | Hobby |
Tim | Football |
Jimmy | Basketball,Tennis |
John | |
Tom | Soccer |
3.外右聯結
- Select A.Name from A Right JOIN B ON A.id = B.id
Name | Hobby |
Tim | Football |
Jimmy | Basketball |
Jimmy | Tennis |
Tom | Soccer |
三.聯表查詢中用到的一些參數
1.USING (column_list):
其作用是爲了方便書寫聯結的多對應關係,大部分情況下USING語句可以用ON語句來代替,如下面例子:
a LEFT JOIN b USING (c1,c2,c3),其作用相當於
a LEFT JOIN b ON a.c1=b.c1 AND a.c2=b.c2 AND a.c3=b.c3
2.STRAIGHT_JOIN:
由於默認情況下MySQL在進行表的聯結的時候會先讀入左表,當使用了這個參數後MySQL將會先讀入右表,這是個MySQL的內置優化參數,大家應該在特定情況下使用,譬如已經確認右表中的記錄數量少,在篩選後能大大提高查詢速度。