空余時(shí)間整理下,mysql的幾種連接查詢,幾個(gè)基本的概念需要記錄下,其他直接用圖解,相對直觀~??
連接查詢
連接查詢:將多張表連到一起進(jìn)行查詢(會(huì)導(dǎo)致記錄數(shù)行和字段數(shù)列發(fā)生改變)
連接查詢的意義
在關(guān)系型數(shù)據(jù)庫設(shè)計(jì)過程中,實(shí)體(表)與實(shí)體之間是存在很多聯(lián)系的。在關(guān)系型數(shù)據(jù)庫表的設(shè)計(jì)過程中,遵循著關(guān)系來設(shè)計(jì):一對一,一對多和多對多,通常在實(shí)際操作的過程中,需要利用這層關(guān)系來保證數(shù)據(jù)的完整性。
連接查詢的種類
-
交叉連接
交叉連接:將兩張表的數(shù)據(jù)與另外一張表彼此交叉
原理:
- 從第一張表依次取出每一條記錄
- 取出每一條記錄之后,與另外一張表的全部記錄挨個(gè)匹配
- 沒有任何匹配條件,所有的結(jié)果都會(huì)進(jìn)行保留
- 記錄數(shù) = 第一張表記錄數(shù) * 第二張表記錄數(shù);字段數(shù) = 第一張表字段數(shù) + 第二張表字段數(shù)(笛卡爾積)
語法: 基本語法:表1 cross join 表2;
應(yīng)用: 交叉連接產(chǎn)生的結(jié)果是笛卡爾積,沒有實(shí)際應(yīng)用。
-
內(nèi)連接
原理:
關(guān)鍵字inner join,從一張表中取出所有的記錄去另外一張表中匹配:利用匹配條件進(jìn)行匹配,成功了則保留,失敗了放棄。
- 從第一張表中取出一條記錄,然后去另外一張表中進(jìn)行匹配
- 利用匹配條件進(jìn)行匹配:
- 匹配到:保留,繼續(xù)向下匹配
- 匹配失?。合蛳吕^續(xù),如果全表匹配失敗,結(jié)束
語法: 表1 [inner] join 表2 on 匹配條件;
- 如果內(nèi)連接沒有條件(允許),那么其實(shí)就是交叉連接(避免)
- 使用匹配條件進(jìn)行匹配
- 因?yàn)楸淼脑O(shè)計(jì)通常容易產(chǎn)生同名字段,尤其是ID,所以為了避免重名出現(xiàn)錯(cuò)誤,通常使用表名.字段名,來確保唯一性
- 通常,如果條件中使用到對應(yīng)的表名,而表名通常比較長,所以可以通過表別名來簡化
- 內(nèi)連接匹配的時(shí)候,必須保證匹配到才會(huì)保存
- 內(nèi)連接因?yàn)椴粡?qiáng)制必須使用匹配條件(on)因此可以在數(shù)據(jù)匹配完成之后,使用where條件來限制,效果與on一樣(建議使用on)
應(yīng)用:
內(nèi)連接通常是在對數(shù)據(jù)有精確要求的地方使用:必須保證兩種表中都能進(jìn)行數(shù)據(jù)匹配。
-
外連接
關(guān)鍵字:outer join,按照某一張表作為主表(表中所有記錄在最后都會(huì)保留),根據(jù)條件去連接另外一張表,從而得到目標(biāo)數(shù)據(jù)。
外連接分為兩種:左外連接(left join),右外連接(right join)
左連接:左表是主表
右連接:右表是主表
原理:
- 確定連接主表:左連接就是left join左邊的表為主表;right join就是右邊為主表
- 拿主表的每一條記錄,去匹配另外一張表(從表)的每一條記錄
- 如果滿足匹配條件:保留;不滿足即不保留
- 如果主表記錄在從表中一條都沒有匹配成功,那么也要保留該記錄:從表對應(yīng)的字段值都未NULL
語法:
左連接:主表 left join 從表 on 連接條件;
右連接:從表 right join 主表 on連接條件;
應(yīng)用:
非常常用的一種獲取的數(shù)據(jù)方式:作為數(shù)據(jù)獲取對應(yīng)主表以及其他數(shù)據(jù)(關(guān)聯(lián))
外連接
左連接
select * from a left join b on a.id = b.id
left join 是left outer join的簡寫,它的全稱是左外連接,是外連接中的一種。
左(外)連接,左表(a_table)的記錄將會(huì)全部表示出來,而右表(b_table)只會(huì)顯示符合搜索條件的記錄。右表記錄不足的地方均為NULL。

右連接
select * from a right join b on a.id = b.id
right join是right outer join的簡寫,它的全稱是右外連接,是外連接中的一種。
與左(外)連接相反,右(外)連接,左表(a_table)只會(huì)顯示符合搜索條件的記錄,而右表(b_table)的記錄將會(huì)全部表示出來。左表記錄不足的地方均為NULL。

全連接
MySQL目前不支持此種方式,可以用其他方式替代解決。
內(nèi)連接
select * from a inner join b on a.id = b.id;
組合兩個(gè)表中的記錄,返回關(guān)聯(lián)字段相符的記錄,也就是返回兩個(gè)表的交集(陰影)部分。
