MySQL中JOIN連接的基本用法實(shí)例
join流程詳解
join 是指 將兩個(gè)表連接起來,兩個(gè)表分別為 驅(qū)動表 和 被驅(qū)動表。
我們拿下面的這個(gè)sql舉例,
select t1.id,t2.id from t1 inner join t2 on t1.id = t2.id where t1.id > 10;
t1和t2 都對 id 建立了索引,我們假設(shè) t1 是驅(qū)動表,t2是被驅(qū)動表。
join流程如下:
1、MySQL每次從t1中讀取一行滿足過濾條件t1.id>10的記錄,如果有索引的話,就利用索引快速定位到表t1中符合t1.id>10的記錄。如果沒有索引的話,就從頭到尾遍歷,慢慢的查出表t1中符合t1.id>10的記錄。
2、當(dāng)從t1中讀取到一條記錄r1后,就根據(jù)連接的條件,也就是 on關(guān)鍵字后的條件,去t2中對應(yīng)的t2中的記錄,將t1的記錄和t2的記錄組合返回給客戶端.
具體的說就是,當(dāng)從t1中得到一條記錄r1的時(shí)候,需要根據(jù)連接條件 t1.id = t2.id,也就是去t2中查詢是否存在記錄r2 ,其中r2.id = r1.id。
也就是執(zhí)行 select t2.id from t2 where t2.id = r1.id
如果有t2的id有索引的話,那么查詢速度是很快的,否則就只能全盤掃描了。
3、就這樣,依次的讀取t1中符合條件的記錄,然后查詢t2,直到t1中的記錄讀取完畢
從上述流程可以看出,join的大致過程就是從驅(qū)動表中挨個(gè)讀取符合條件的記錄,然后根據(jù)連接條件到被驅(qū)動表中找出符合條件的記錄,將其組合到一起返回給客戶端。
JOIN用于連表查詢,主要有5種用法。下面分別演示這5種用法
隨便建2張表,結(jié)構(gòu)如下
字段col1用來使兩張表有一個(gè)同名字段的(但其實(shí)沒什么用,因?yàn)椴樵儣l件都需要用ON來指定,這里只是說明一下如果有相同的字段名也沒什么影響)
一、笛卡爾積:CROSS JOIN
CROSS JOIN使兩張表的所有字段直接進(jìn)行笛卡爾積,假設(shè)表1有m條數(shù)據(jù),表2有n條數(shù)據(jù),則結(jié)果數(shù)量為m*n條
SELECT * FROM tab1 CROSS JOIN tab2
結(jié)果
二、內(nèi)連接:INNER JOIN
內(nèi)連接需要用ON來指定兩張表需要比較的字段,最終結(jié)果只顯示滿足條件的數(shù)據(jù)
SELECT * FROM tab1 INNER JOIN tab2 ON tab1.id1 = tab2.id2
結(jié)果
注意到內(nèi)連接只把滿足ON條件的數(shù)據(jù)相連接,與笛卡爾積不同
三、左連接:LEFT JOIN
左連接可以看做在內(nèi)連接的基礎(chǔ)上,把左表中不滿足ON條件的數(shù)據(jù)也顯示出來,但結(jié)果中的右表部分中的數(shù)據(jù)為NULL
SELECT * FROM tab1 LEFT JOIN tab2 ON tab1.id1 = tab2.id2
結(jié)果
四、右連接:RIGHT JOIN
右連接就是與左連接完全相反
SELECT * FROM tab1 RIGHT JOIN tab2 ON tab1.id1 = tab2.id2
結(jié)果
五、全連接:OUTER JOIN
全連接就是左連接和右連接的并集,但是MySQL中并不支持全連接的寫法
SELECT * FROM tab1 OUTER JOIN tab2 ON tab1.id1 = tab2.id2
不過可以用UNION聯(lián)合左連接和右連接的結(jié)果來代替
SELECT * FROM tab1 LEFT JOIN tab2 ON tab1.id1 = tab2.id2 UNION SELECT * FROM tab1 RIGHT JOIN tab2 ON tab1.id1 = tab2.id2
結(jié)果
總結(jié)
到此這篇關(guān)于MySQL中JOIN連接基本用法的文章就介紹到這了,更多相關(guān)MySQL JOIN用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Win2008 R2 mysql 5.5 zip格式mysql 安裝與配置
這篇文章主要介紹了Win2008 R2 mysql 5.5 zip格式mysql 安裝與配置,需要的朋友可以參考下2017-06-06linux下mysql自動備份數(shù)據(jù)庫與自動刪除臨時(shí)文件
mysql自動備份數(shù)據(jù)庫與自動刪除臨時(shí)文件,有需要的朋友可以參考下2013-02-02阿里云centos7使用yum安裝mysql的正確姿勢(推薦)
這篇文章主要介紹了阿里云centos7使用yum安裝mysql的正確姿勢,需要的朋友可以參考下2017-07-07一個(gè)案例徹底弄懂如何正確使用mysql inndb聯(lián)合索引
今天小編就為大家分享一篇關(guān)于一個(gè)案例徹底弄懂如何正確使用mysql inndb聯(lián)合索引,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-02-02MySQL基于group_concat()函數(shù)合并多行數(shù)據(jù)
這篇文章主要介紹了MySQL基于group_concat()函數(shù)合并多行數(shù)據(jù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10軟件測試-MySQL(六:數(shù)據(jù)庫函數(shù))
這篇文章主要介紹了MySQL數(shù)據(jù)庫函數(shù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04用批處理實(shí)現(xiàn)自動備份和清理mysql數(shù)據(jù)庫的代碼
有網(wǎng)友問我在win2003下如何自動備份MySQL數(shù)據(jù)庫,既然是自動備份,那肯定得寫腳本,當(dāng)然我們也可以利用軟件實(shí)現(xiàn)2013-08-08MySQL中USING 和 HAVING 用法實(shí)例簡析
這篇文章主要介紹了MySQL中USING 和 HAVING 用法,結(jié)合實(shí)例形式簡單分析了mysql中USING 和 HAVING的功能、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-08-08