日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

解決Mysql的left join無效及使用的注意事項說明

瀏覽:217日期:2023-10-01 12:41:46
Mysql的left join無效及使用

今天寫sql發現使用left join 沒有把左邊表的數據全部查詢出來,讓我郁悶了一會,后來仔細研究了一會才知道自己犯了個常識性的錯誤(我是菜鳥)

這是原sql

解決Mysql的left join無效及使用的注意事項說明

這樣的查詢并不能將tb_line這張表的數據都查詢出來,好尷尬...

后面我才知道原來當我們進行多表查詢,在執行到where之前,會先形成一個臨時表

而on就是臨時表中的條件篩選,使用left join則不管條件是否為真,都會查詢出左邊表的數據,條件為假的,則顯示為null

解決Mysql的left join無效及使用的注意事項說明

where則是在臨時表生成之后的過濾條件

解決Mysql的left join無效及使用的注意事項說明

在第一張圖中,我將tb_vehicle這張表的過濾條件放在where之中,那left join所產生條件為假的數據,則會在where 的 v.del_flag=’0’中被過濾掉(因為條件為假的數據,del_flag都為空)

所以我看似使用了left join ,實際上這樣寫與使用inner join的結果是一樣的

正確sql如下:

解決Mysql的left join無效及使用的注意事項說明

在臨時表中就做好條件篩選,這樣就能夠得到左邊表的數據

總結:

使用left join 并需要做條件查詢的時候,需要仔細斟酌改條件篩選放在on后面還是where后面

Mysql left join 避坑指南現象

left join在我們使用mysql查詢的過程中可謂非常常見,比如博客里一篇文章有多少條評論、商城里一個貨物有多少評論、一條評論有多少個贊等等。但是由于對join、on、where等關鍵字的不熟悉,有時候會導致查詢結果與預期不符,所以今天我就來總結一下,一起避坑。

這里我先給出一個場景,并拋出兩個問題,如果你都能答對那這篇文章就不用看了。

假設有一個班級管理應用,有一個表classes,存了所有的班級;有一個表students,存了所有的學生,具體數據如下:

SELECT * FROM classes;

解決Mysql的left join無效及使用的注意事項說明

SELECT * FROM students;

解決Mysql的left join無效及使用的注意事項說明

那么現在有兩個需求:

找出每個班級的名稱及其對應的女同學數量

找出一班的同學總數

對于需求1,大多數人不假思索就能想出如下兩種sql寫法,請問哪種是對的?

SELECT c.name, count(s.name) as num FROM classes c left join students s on s.class_id = c.id and s.gender = ’F’ group by c.name

或者

SELECT c.name, count(s.name) as num FROM classes c left join students s on s.class_id = c.id where s.gender = ’F’ group by c.name

對于需求2,大多數人也可以不假思索的想出如下兩種sql寫法,請問哪種是對的?

SELECT c.name, count(s.name) as num FROM classes c left join students s on s.class_id = c.id where c.name = ’一班’ group by c.name

或者

SELECT c.name, count(s.name) as num FROM classes c left join students s on s.class_id = c.id and c.name = ’一班’ group by c.name

請不要繼續往下翻 !!先給出你自己的答案,正確答案就在下面。

~

~

~

答案是兩個需求都是第一條語句是正確的,要搞清楚這個問題,就得明白mysql對于left join的執行原理,下節進行展開。

根源

mysql 對于left join的采用類似嵌套循環的方式來進行從處理,以下面的語句為例:

SELECT * FROM LT LEFT JOIN RT ON P1(LT,RT)) WHERE P2(LT,RT)

其中P1是on過濾條件,缺失則認為是TRUE,P2是where過濾條件,缺失也認為是TRUE,該語句的執行邏輯可以描述為:

FOR each row lt in LT {// 遍歷左表的每一行 BOOL b = FALSE; FOR each row rt in RT such that P1(lt, rt) {// 遍歷右表每一行,找到滿足join條件的行 IF P2(lt, rt) {//滿足 where 過濾條件 t:=lt||rt;//合并行,輸出該行 } b=TRUE;// lt在RT中有對應的行 } IF (!b) { // 遍歷完RT,發現lt在RT中沒有有對應的行,則嘗試用null補一行 IF P2(lt,NULL) {// 補上null后滿足 where 過濾條件 t:=lt||NULL; // 輸出lt和null補上的行 } }}

當然,實際情況中MySQL會使用buffer的方式進行優化,減少行比較次數,不過這不影響關鍵的執行流程,不在本文討論范圍之內。

從這個偽代碼中,我們可以看出兩點:

如果想對右表進行限制,則一定要在on條件中進行,若在where中進行則可能導致數據缺失,導致左表在右表中無匹配行的行在最終結果中不出現,違背了我們對left join的理解。因為對左表無右表匹配行的行而言,遍歷右表后b=FALSE,所以會嘗試用NULL補齊右表,但是此時我們的P2對右表行進行了限制,NULL若不滿足P2(NULL一般都不會滿足限制條件,除非IS NULL這種),則不會加入最終的結果中,導致結果缺失。

如果沒有where條件,無論on條件對左表進行怎樣的限制,左表的每一行都至少會有一行的合成結果,對左表行而言,若右表若沒有對應的行,則右表遍歷結束后b=FALSE,會用一行NULL來生成數據,而這個數據是多余的。所以對左表進行過濾必須用where。

下面展開兩個需求的錯誤語句的執行結果和錯誤原因:

需求1

解決Mysql的left join無效及使用的注意事項說明

需求2

解決Mysql的left join無效及使用的注意事項說明

需求1由于在where條件中對右表限制,導致數據缺失(四班應該有個為0的結果)

需求2由于在on條件中對左表限制,導致數據多余(其他班的結果也出來了,還是錯的)

總結

通過上面的問題現象和分析,可以得出了結論:在left join語句中,左表過濾必須放where條件中,右表過濾必須放on條件中,這樣結果才能不多不少,剛剛好。

SQL 看似簡單,其實也有很多細節原理在里面,一個小小的混淆就會造成結果與預期不符,所以平時要注意這些細節原理,避免關鍵時候出錯。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: MySQL 數據庫
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩中文字幕| 久久精品网址| 最新日韩av| 日本 国产 欧美色综合| 日本v片在线高清不卡在线观看| 91欧美日韩在线| 国产精品porn| 日韩高清成人| 午夜在线视频一区二区区别| 日本免费在线视频不卡一不卡二| 性欧美69xoxoxoxo| 四虎在线精品| 国产伦精品一区二区三区在线播放 | 日本精品黄色| 国产高清久久| 国产日韩中文在线中文字幕| 国产精品二区不卡| 国产精品网站在线看| 日韩欧美一区二区三区免费观看| 7777精品| av免费不卡国产观看| 女主播福利一区| 美女网站久久| 欧美极品中文字幕| 国产一区亚洲| 国产情侣一区| 秋霞国产精品| 日韩黄色免费网站| 九九精品调教| 欧美综合精品| 激情五月综合网| 免费一级欧美在线观看视频| 不卡一区2区| 国产情侣久久| 在线一区视频| 日韩精品诱惑一区?区三区| 亚洲精品黄色| 91精品一区二区三区综合在线爱| 欧美亚洲tv| 亚洲精品1区2区| 激情综合五月| 日韩成人一级| 国产精品试看| 成人看片网站| 久久中文在线| 日韩精品一区二区三区中文在线 | 狠狠操综合网| 亚洲风情在线资源| 国产乱码精品一区二区三区亚洲人| 亚洲视频播放| 啪啪国产精品| 电影91久久久| 欧美一区不卡| 午夜精品一区二区三区国产| 国产成人精品一区二区三区免费| 亚洲乱亚洲高清| 激情综合自拍| 国产成人免费精品| 91精品国产自产观看在线 | 久久精品国产网站| 日韩福利视频导航| 日韩视频一区| 日本在线精品| 日韩成人精品一区二区| 日本电影久久久| 久久午夜影视| 欧美久久精品一级c片| 四虎国产精品免费观看| 国产精品一线天粉嫩av| 天海翼亚洲一区二区三区| 鲁大师成人一区二区三区| 黑丝美女一区二区| 欧美精选视频一区二区| 激情久久一区二区| 久久伊人亚洲| 狂野欧美性猛交xxxx| 亚洲精品自拍| 天堂成人免费av电影一区| 久久亚洲精品中文字幕蜜潮电影| 国产精品原创| 丁香婷婷久久| 福利一区二区三区视频在线观看| 国产精品jk白丝蜜臀av小说| 国产日韩高清一区二区三区在线 | 911亚洲精品| 日韩二区在线观看| 日韩精品免费视频一区二区三区| 蜜桃视频一区二区| 综合亚洲自拍| 天堂va欧美ⅴa亚洲va一国产| 亚洲青青久久| 亚洲久草在线| 日韩视频1区| 欧美日韩午夜| 国产精品一区三区在线观看| 欧美国产另类| 精品久久久久中文字幕小说| 精品亚洲二区| 天堂√中文最新版在线| 午夜精品久久久久久久久久蜜桃| 亚洲不卡av不卡一区二区| 婷婷激情一区| 午夜欧美精品| 综合激情五月婷婷| 日本中文字幕视频一区| 久久国产人妖系列| 久久精品国产免费| 欧洲精品一区二区三区| 欧美女激情福利| 国产一区91| 日本欧美一区二区| 国产精品入口久久| 国产精品久久久久久久免费观看| 久久婷婷激情| 视频一区视频二区中文| 日韩综合小视频| 精品美女视频 | 美女视频网站久久| 成人精品视频| 影视先锋久久| 久久福利影视| 久久精品99国产精品日本| 国产成人免费| 国精品一区二区三区| 性色av一区二区怡红| 久久激情五月婷婷| 国产精品亲子伦av一区二区三区| 美女av一区| 欧美.日韩.国产.一区.二区 | 久久99久久人婷婷精品综合| 激情黄产视频在线免费观看| 久久精品1区| 亚洲一区二区三区在线免费| 欧美亚洲综合视频| 午夜影院一区| 日韩精品一级二级| 国产乱人伦丫前精品视频| 中文字幕成在线观看| 欧美~级网站不卡| 日韩国产在线观看| 久久精品国产999大香线蕉| 99精品美女| 五月激激激综合网色播| 久久久精品国产**网站| 午夜久久美女| 国产精品蜜月aⅴ在线| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 国产日韩一区二区三区在线播放| 国产成人精品一区二区三区在线| 欧美日韩视频| 国产探花在线精品| 91精品蜜臀一区二区三区在线| 亚洲三级观看| 日韩电影免费网址| 色综合视频一区二区三区日韩| 韩国一区二区三区视频| 一级欧美视频| 98精品视频| 日韩高清不卡一区二区| 日韩不卡免费高清视频| 日韩二区三区四区| 亚洲欧美一区在线| 国产极品一区| 免费日本视频一区| 黄在线观看免费网站ktv| 视频一区日韩| 久久久影院免费| 麻豆一区二区三区| 亚洲日本在线观看视频| 在线日韩欧美| 精品一区二区三区亚洲| 美美哒免费高清在线观看视频一区二区| 捆绑调教日本一区二区三区| 日本少妇精品亚洲第一区| 激情丁香综合| 国产精品久久久久久久免费观看 | 国产精品一线| 尹人成人综合网| 福利片在线一区二区| 日本vs亚洲vs韩国一区三区二区| 国产真实久久| 日韩成人精品一区二区| 国产精品一区二区精品 | 中文字幕亚洲精品乱码| 欧洲av一区二区| 国产精品porn| 日本欧美一区二区| 美国三级日本三级久久99 | 伊人久久视频| 国产探花在线精品| 亚洲精品自拍| 午夜日韩av| 婷婷成人在线| 日韩欧美综合| 精品成av人一区二区三区 | 免费在线观看一区| 91亚洲精品视频在线观看| 亚洲一区黄色| 久久久久久美女精品| 天堂av在线|