MySQL中常見的連接查詢有:等值連接,使用=連接兩列數(shù)據(jù),所有能夠匹配的結(jié)果都會被顯示出來;內(nèi)連接,關(guān)鍵字INNER JOIN ON,連接效果等同于等值連接;左連接,關(guān)鍵字LEFT JOIN ON,關(guān)鍵字左側(cè)的表的所有數(shù)據(jù)均顯示,關(guān)鍵字右側(cè)的表匹配內(nèi)容顯示,無對應(yīng)內(nèi)容使用NULL填充;右連接,關(guān)鍵字RIGHT JOIN ON,關(guān)鍵字右側(cè)的表的所有數(shù)據(jù)均顯示,關(guān)鍵字左側(cè)的表匹配內(nèi)容顯示,無對應(yīng)內(nèi)容使用NULL填充;一般情況下,左連接和右連接可以實現(xiàn)相同的連接效果。如果對這部分內(nèi)容感興趣,可以從黑馬程序員獲取測試相關(guān)課程了解一下。
10余年的崇陽網(wǎng)站建設(shè)經(jīng)驗,針對設(shè)計、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。成都營銷網(wǎng)站建設(shè)的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整崇陽建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計,從而大程度地提升瀏覽體驗。創(chuàng)新互聯(lián)公司從事“崇陽網(wǎng)站設(shè)計”,“崇陽網(wǎng)站推廣”以來,每個客戶項目都認(rèn)真落實執(zhí)行。
一般所說的左連接,外連接是指左外連接,右外連接。做個簡單的測試你看吧。
先說左外連接和右外連接:
[TEST1@orcl#16-12月-11] SQLselect * from t1;
ID NAME
---------- --------------------
1 aaa
2 bbb
[TEST1@orcl#16-12月-11] SQLselect * from t2;
ID AGE
---------- ----------
1 20
3 30
左外連接:
[TEST1@orcl#16-12月-11] SQLselect * from t1 left join t2 on t1.id=t2.id;
ID NAME ID AGE
---------- -------------------- ---------- ----------
1 aaa 1 20
2 bbb
右外連接:
[TEST1@orcl#16-12月-11] SQLselect * from t1 right join t2 on t1.id=t2.id;
ID NAME ID AGE
---------- -------------------- ---------- ----------
1 aaa 1 20
3 30
從上面的顯示你可以看出:左外連接是以左邊的表為基準(zhǔn)。通俗的講,先將左邊的表全部顯示出來,然后右邊的表id與左邊表id相同的記錄就“拼接”上去,比如說id為1的記錄。如果沒有匹配的id,比如說t1中id為2的t2中就沒有。那邊就以null顯示。
右外連接過程正好相反。
再看內(nèi)連接:
[TEST1@orcl#16-12月-11] SQLselect * from t1 inner join t2 on t1.id=t2.id;
ID NAME ID AGE
---------- -------------------- ---------- ----------
1 aaa 1 20
看到?jīng)]有? 只有一條記錄。內(nèi)連接就是只取出符合過濾條件的記錄 也就是t1.id=t2.id 那么符合t1.id=t2.id的記錄只有id=1這一條,所以只顯示一條。 不像外連接,是將你作為基準(zhǔn)的表(左外連接就是左邊表為基準(zhǔn),右外連接就是右邊表為基準(zhǔn))的所有行都顯示出來。
會。
先連接后過濾:左連接leftjoin后,連接的右邊的表未匹配到話會顯示空值,但是加篩選條件就會把這些空值篩選掉,這些空值有部分其實用左連接是要保留下來的,結(jié)果經(jīng)過過濾給過濾掉了,因此左連接的數(shù)據(jù)變少了,還是會被查出來的。
SQL查詢左連接、右連接、內(nèi)連接。左連接的定義是以左表為基礎(chǔ),根據(jù)ON后給出的兩表的條件將兩表連接起來。結(jié)果會將左表所有的查詢信息列出,而右表只列出ON后條件與左表滿足的部分。
左連接:返回包括左表中的所有記錄和右表中聯(lián)結(jié)字段相等的記錄;
右連接:返回包括右表中的所有記錄和左表中聯(lián)結(jié)字段相等的記錄;
全連接:返回兩個連接表的所有記錄;mysql沒有全連接
內(nèi)連接:返回兩個連接表連接字段相同的記錄;
union:對兩個結(jié)果集進(jìn)行并集,并去重,當(dāng)交換兩個select語句順序后,最終結(jié)果與不交換時無區(qū)別;
union all:對兩個結(jié)果集進(jìn)行并集,不去重,當(dāng)交換兩個select語句順序后,最終結(jié)果與不交換時有區(qū)別;
舉個例子 有一個學(xué)生表 班級 姓名 一個成績表 姓名 成績 我們需要返回X班的所有學(xué)生的成績,但是班上有人缺考,也就是成績表里沒有姓名,我們先用on得到的就是有考試成績的名字,通過外連接,我們就可以得到全班人的名字以及成績。
現(xiàn)象:列表頁因超時查不出來東西,使用postman模擬請花費40多秒,將sql語句單獨提出來后查詢速度非常慢,40多秒
先上結(jié)論:
在兩個表關(guān)聯(lián)字段上建立索引解決此問題,下面的內(nèi)容比這句話爽多了,請繼續(xù)看
表結(jié)構(gòu)如下:
users(用戶)表:id,name
integal_record(分?jǐn)?shù)記錄)表:id,user_id,integal_id
其中,integal_record表的user_id關(guān)聯(lián)著users表的id,業(yè)務(wù)目的是查詢每個員工閱讀次數(shù)、評論次數(shù)和積分總和,查詢語句如下:
(里面寫死的值是我從mybatis里扣出來的)
integral_id=1代表著閱讀,integral_id=2代表著評論
查詢時間快半分鐘是無法讓人接受的,從表象的SQL語句來說,首先我們看到有很多SUM函數(shù),因此我們來測試下SUM函數(shù)的計算時間,如下查詢每個人閱讀的累計次數(shù):
可以看出來計算時間很長和SUM函數(shù)沒什么關(guān)系,再看整個SQL除了一些SUM函數(shù)外就剩下users表左聯(lián)integal_record表,我們把條件去掉,直接就寫個左查詢試試
amazing,我的users表里有13400條數(shù)據(jù),關(guān)聯(lián)的integral_record 表里也有13000條數(shù)據(jù),僅僅做了左連接竟然花費了70秒,這肯定是超時的元兇;所以我們explain一下,看看mysql對這條數(shù)據(jù)的查詢策略:
查看結(jié)果:
我們看到type字段的結(jié)果是All,也就是代表全表掃描,那么就好辦了,建立索引即可,其中users表中的id屬于主鍵,策略自增,有默認(rèn)的索引,不在考慮范圍內(nèi),我們僅需對integral_record表增加索引即可:
繼續(xù)執(zhí)行左聯(lián)語句查看運行時間:
時間仍然很久,索引并沒有起作用,這里排除一些逃避困難時的迷信想法:mysql有bug 或者navicat有bug,有網(wǎng)絡(luò)問題 哈哈哈.....我們來看左聯(lián)的關(guān)鍵屬性:
執(zhí)行時間從60多秒變成了0.375s,整個世界都安靜了,再次explain一下
發(fā)現(xiàn)mtemp(integal)表的檢索方式從all變成了ref,索引,快的一批,深呼吸....
希望繼續(xù)遇到這種sql需要優(yōu)化的問題來增加sql調(diào)優(yōu)相關(guān)經(jīng)驗
當(dāng)前標(biāo)題:mysql左連接查詢怎么,MySQL連接查詢
鏈接地址:http://chinadenli.net/article38/hecgpp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈、定制開發(fā)、微信公眾號、移動網(wǎng)站建設(shè)、品牌網(wǎng)站制作、服務(wù)器托管
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)