婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 解決Mysql的left join無效及使用的注意事項說明

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

熱門標簽:拉卡拉外呼系統(tǒng) 400電話可以辦理嗎 臨清電話機器人 智能外呼系統(tǒng)復位 話務外呼系統(tǒng)怎么樣 高清地圖標注道路 外東北地圖標注 大眾點評星級酒店地圖標注 云南電商智能外呼系統(tǒng)價格

Mysql的left join無效及使用

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

這是原sql

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

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

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

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

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

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

正確sql如下:

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

總結:

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

Mysql left join 避坑指南

現象

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

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

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

SELECT * FROM classes;

SELECT * FROM students;

那么現在有兩個需求:

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

找出一班的同學總數

對于需求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

請不要繼續(xù)往下翻 ?。∠冉o出你自己的答案,正確答案就在下面。

~

~

~

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

根源

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

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

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

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,發(fā)現lt在RT中沒有有對應的行,則嘗試用null補一行
    IF P2(lt,NULL) {// 補上null后滿足 where 過濾條件
      t:=lt||NULL; // 輸出lt和null補上的行
    }         
  }
}

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

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

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

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

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

需求1

需求2

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

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

總結

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

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

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • 淺談mysql join底層原理
  • SQL語句中JOIN的用法場景分析
  • MYSQL數據庫基礎之Join操作原理
  • mysql left join快速轉inner join的過程
  • 為什么代碼規(guī)范要求SQL語句不要過多的join
  • mysql高效查詢left join和group by(加索引)
  • MySQL的join buffer原理
  • SQL之各種join小結詳細講解

標簽:阿里 溫州 無錫 山西 三明 定西 福州 揚州

巨人網絡通訊聲明:本文標題《解決Mysql的left join無效及使用的注意事項說明》,本文關鍵詞  解決,Mysql,的,left,join,無效,;如發(fā)現本文內容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內容系統(tǒng)采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《解決Mysql的left join無效及使用的注意事項說明》相關的同類信息!
  • 本頁收集關于解決Mysql的left join無效及使用的注意事項說明的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国产伦精品一区二区三区视频青涩 | 欧洲视频一区二区| 欧美性xxxxxx少妇| 亚洲精品美腿丝袜| 91蜜桃视频在线| 亚洲欧美日韩精品久久久久| 99精品一区二区三区| 成人欧美一区二区三区小说 | 视频一区二区中文字幕| 秋霞国产午夜精品免费视频| 久久国产免费看| 欧洲亚洲国产日韩| 国产精品成人在线观看| 国产suv精品一区二区三区| 欧美亚一区二区| 中文字幕亚洲精品在线观看| 美美哒免费高清在线观看视频一区二区 | 欧美天天综合网| 中文字幕av一区二区三区| 欧美国产亚洲另类动漫| 久久女同互慰一区二区三区| 精品一区二区免费视频| 国产精品日日摸夜夜摸av| 国产91精品精华液一区二区三区| 日韩精品一区二区三区在线播放| 成人午夜视频在线| 色88888久久久久久影院按摩 | 成人精品在线视频观看| 亚洲一区二区在线播放相泽| 波多野结衣一区二区三区| 亚洲一区av在线| 亚洲色图欧洲色图婷婷| 成人免费视频视频在线观看免费 | 99v久久综合狠狠综合久久| 国产精品久线在线观看| 欧美日韩精品免费| 东方欧美亚洲色图在线| 亚洲视频你懂的| 欧美另类一区二区三区| 色偷偷久久一区二区三区| 欧美日韩国产精品成人| 92精品国产成人观看免费| 首页国产欧美日韩丝袜| 国产精品久久久久久久久久久免费看 | 成人免费视频一区二区| 久久久精品中文字幕麻豆发布| 91尤物视频在线观看| 蜜臀av性久久久久av蜜臀妖精 | 日本高清不卡视频| 国产精品一区二区三区网站| 美女久久久精品| 精品国产百合女同互慰| 欧美亚洲综合久久| 成人性生交大片免费看中文| 久久精品欧美一区二区三区不卡 | 欧美午夜片在线观看| 国产精一区二区三区| 夜夜嗨av一区二区三区| 午夜精品久久久久影视| 肉丝袜脚交视频一区二区| 国产在线国偷精品免费看| 欧美激情艳妇裸体舞| 日韩精品五月天| 久草精品在线观看| 国产成人av影院| 欧美日韩亚洲综合| 欧美精品粉嫩高潮一区二区| 精品国产精品网麻豆系列| 亚洲日本va在线观看| 日本一区二区成人在线| 伊人开心综合网| 蜜臀a∨国产成人精品| 不卡免费追剧大全电视剧网站| 91亚洲精品久久久蜜桃网站 | 欧美性极品少妇| 欧美成人在线直播| 自拍av一区二区三区| 色88888久久久久久影院野外| 亚洲人成伊人成综合网小说| 欧美亚洲一区三区| 国产91丝袜在线观看| 91香蕉视频污在线| 欧美一区二区三区播放老司机| 欧美电影一区二区| 国产精品欧美极品| 亚洲不卡av一区二区三区| 亚洲天堂av一区| 日本大胆欧美人术艺术动态| 精品99999| 毛片av一区二区三区| av影院午夜一区| 亚洲丝袜制服诱惑| 欧美在线观看视频一区二区三区| 精品国产百合女同互慰| 国内外精品视频| 亚洲福利视频一区二区| 亚洲一区精品在线| 日本午夜一区二区| 精品国产免费视频| 国产一区美女在线| 国产精品入口麻豆原神| 美女网站色91| 一区精品在线播放| 欧洲av在线精品| 狠狠色狠狠色合久久伊人| 亚洲成人先锋电影| 国产suv精品一区二区883| 色婷婷久久99综合精品jk白丝| 亚洲人一二三区| 91精品国产综合久久久久久久| 看国产成人h片视频| 国产欧美一区二区在线| caoporn国产一区二区| 亚洲午夜激情网页| 日韩美女视频一区| 亚洲欧洲精品一区二区精品久久久 | 久久精品一区二区三区不卡| 91年精品国产| 日本美女一区二区| 亚洲国产综合人成综合网站| 国产免费成人在线视频| 日韩视频一区二区三区在线播放| 欧美精品一二三区| 人人爽香蕉精品| 激情五月激情综合网| 免费在线欧美视频| 亚洲精品一二三| 欧美色图一区二区三区| 亚洲影院在线观看| 在线日韩av片| 亚洲成av人影院在线观看网| 久久久久久久久伊人| 国产精品美女久久久久久2018| 国产乱码精品一区二区三区忘忧草| 亚洲六月丁香色婷婷综合久久 | 日产欧产美韩系列久久99| 国产日韩欧美高清| 久久久三级国产网站| 精品国精品自拍自在线| 欧美日韩国产片| 91精品久久久久久久久99蜜臂| 欧美日韩一区久久| 欧美日韩精品欧美日韩精品一综合| 国产99久久精品| 91极品美女在线| 色综合天天狠狠| 7777精品伊人久久久大香线蕉最新版| 久久99精品久久久久久| 国产日韩欧美一区二区三区综合| 欧美日韩在线播放三区四区| 成人av免费网站| 成人高清伦理免费影院在线观看| 国产精品中文欧美| 成人在线一区二区三区| 成人av资源下载| 欧美日韩免费在线视频| 日韩三级av在线播放| 成人在线综合网| 欧美三级在线看| 26uuu精品一区二区| 一区二区三区四区在线播放| 日韩精品一二区| 国产成人综合在线| 97久久久精品综合88久久| 国产大片一区二区| 91在线视频播放| av资源站一区| 色偷偷一区二区三区| 欧美日韩一区二区在线观看视频 | 一个色在线综合| 国产一区二区h| 欧美日韩二区三区| 亚洲女人的天堂| 图片区日韩欧美亚洲| 国产91精品一区二区| 精品国产99国产精品| 免费成人av资源网| 亚洲视频在线一区| 99re在线精品| 亚洲图片自拍偷拍| 欧美午夜一区二区| 亚洲精品中文字幕在线观看| 色偷偷88欧美精品久久久| 国产欧美精品一区| 成人av在线网站| 日韩精品一区二区三区视频播放| 日本欧美大码aⅴ在线播放| 91精品1区2区| 午夜精彩视频在线观看不卡| 91亚洲资源网| 日韩黄色片在线观看| 日韩欧美在线1卡| 成人开心网精品视频| 视频一区二区三区中文字幕| 26uuuu精品一区二区| 日本免费新一区视频| 欧美色爱综合网| 成人黄页毛片网站| 亚洲一区二区三区四区五区中文| 欧美在线免费视屏|