(转)MySQL联表查询
資料源于網(wǎng)絡(luò)
一.內(nèi)聯(lián)結(jié)、外聯(lián)結(jié)、左聯(lián)結(jié)、右聯(lián)結(jié)的含義及區(qū)別
在SQL標準中規(guī)劃的(Join)聯(lián)結(jié)大致分為下面四種:
1.內(nèi)聯(lián)結(jié):將兩個表中存在聯(lián)結(jié)關(guān)系的字段符合聯(lián)結(jié)關(guān)系的那些記錄形成記錄集的聯(lián)結(jié)。
2.外聯(lián)結(jié):分為外左聯(lián)結(jié)和外右聯(lián)結(jié)。
左聯(lián)結(jié)A、B表的意思就是將表A中的全部記錄和表B中聯(lián)結(jié)的字段與表A的聯(lián)結(jié)字段符合聯(lián)結(jié)條件的那些記錄形成的記錄集的聯(lián)結(jié),這里注意的是最后出來的記錄集會包括表A的全部記錄。
右聯(lián)結(jié)A、B表的結(jié)果和左聯(lián)結(jié)B、A的結(jié)果是一樣的,也就是說:
1 | Select A.name B.name From A Left Join B On A.id=B.id |
和
1 | Select A.name B.name From B Right Join A on B.id=A.id |
執(zhí)行后的結(jié)果是一樣的。
3.全聯(lián)結(jié):將兩個表中存在聯(lián)結(jié)關(guān)系的字段的所有記錄取出形成記錄集的聯(lián)結(jié)。
4.無聯(lián)結(jié):沒有使用聯(lián)結(jié)功能,也有自聯(lián)結(jié)的說法。
內(nèi)外聯(lián)結(jié)的區(qū)別是內(nèi)聯(lián)結(jié)將去除所有不符合條件的記錄,而外聯(lián)結(jié)則保留其中部分。外左聯(lián)結(jié)與外右聯(lián)結(jié)的區(qū)別在于如果用A左聯(lián)?結(jié)B則A中所有記錄都會保留在結(jié)果中,此時B中只有符合聯(lián)結(jié)條件的記錄,而右聯(lián)結(jié)相反。
二.例子
假設(shè)有如下兩張表:
| ID | Name |
| 1 | Tiim |
| 2 | Jimmy |
| 3 | John |
| 4 | Tom |
| ID | Hobby |
| 1 | Football |
| 2 | Basketball |
| 2 | Tennis |
| 4 | Soccer |
1內(nèi)聯(lián)結(jié):
1 | Select A.Name from A INNER JOIN B ON A.id = B.id |
這是隱式的內(nèi)聯(lián)結(jié),查詢的結(jié)果是:
| Name | Hobby |
| Tim | Football |
| Jimmy | Basketball |
| Jimmy | Tennis |
| Tom | Soccer |
它的作用和
1 | Select A.Name from A INNER JOIN B ON A.id = B.id |
是一樣的。
2.外左聯(lián)結(jié)
1 | Select A.Name from A Left JOIN B ON A.id = B.id |
這樣查詢得到的結(jié)果將會是保留所有A表中聯(lián)結(jié)字段的記錄,若無與其相對應的B表中的字段記錄則留空,結(jié)果如下:
| Name | Hobby |
| Tim | Football |
| Jimmy | Basketball,Tennis |
| John | ? |
| Tom | Soccer |
所以從上面結(jié)果看出,因為A表中的John記錄的ID沒有在B表中有對應ID,因此為空,但Name欄仍有John記錄。
3.外右聯(lián)結(jié)
1 | Select A.Name from A Right JOIN B ON A.id = B.id |
結(jié)果將會是:
| Name | Hobby |
| Tim | Football |
| Jimmy | Basketball |
| Jimmy | Tennis |
| Tom | Soccer |
三.聯(lián)表查詢中用到的一些參數(shù)
1.USING?(column_list):
其作用是為了方便書寫聯(lián)結(jié)的多對應關(guān)系,大部分情況下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在進行表的聯(lián)結(jié)的時候會先讀入左表,當使用了這個參數(shù)后MySQL將會先讀入右表,這是個MySQL的內(nèi)置優(yōu)化參數(shù),大家應該在特定情況下使用,譬如已經(jīng)確認右表中的記錄數(shù)量少,在篩選后能大大提高查詢速度。
轉(zhuǎn)載于:https://www.cnblogs.com/itjiandan/p/3508254.html
總結(jié)
以上是生活随笔為你收集整理的(转)MySQL联表查询的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《相和歌辞·王昭君二首》第六句是什么
- 下一篇: 配置zendframework开始工作(