含義:LEFT JOIN 關鍵字會從左表 (table_name1) 那裏返回全部的行,即便在右表 (table_name2) 中沒有匹配的行。sql
Mysql對於left join採用相似嵌套循環的方式進行處理,例如:spa
SELECT * FROM LT LEFT JOIN RT ON P1(LT,RT)) WHERE P2(LT,RT)
其中p1是on的過濾條件,缺失則認爲rue,p2是where過濾條件,缺失也認爲是true,該語句的執行邏輯能夠描述爲:code
FOR each row lt in LT{//遍歷左表的每一行 BOOL b = FALSE; FOR each row in RT such that P1(lt,rt){//遍歷右表的每一行,找到知足on條件的行 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補上的行 } } }
從中能夠看出兩點:table
一、若是想要對右表進行限制,則必定要在on條件中進行,若在where條件中進行,則可能致使數據缺失,致使左表在右表中無匹配行的行在最終結果中不出現,違背了咱們對leftjoin的理解。由於對左表無右表匹配行的行而言,遍歷右表後b=false,因此會嘗試用null補齊右表,可是此時咱們的P2對右表進行了限制,null若不知足P2(null通常都不會知足限制條件,除非 is null這種),則不會加入最終的結果中,致使結果缺失。class
二、若是沒有where條件,不管on條件對左邊進行怎樣的限制,左表的每一行都至少會有一行的合成結果,對左錶行而言,若右表沒有對應的行,則右表遍歷結束後b=false,會用一行null來生成數據,而這個數據是多餘的,因此對左表進行過濾必須使用where。循環
總結:遍歷
1.多表left join是會生成一張臨時表,並返回給用戶並行
2.where條件是針對最後生成的這張臨時表進行過濾,過濾掉不符合where條件的記錄,是真正的不符合就過濾掉。總結
3.on條件是對left join的右表進行條件過濾,但依然返回左表的全部行,右表中沒有的補爲NULL數據
4.on條件中若是有對左表的限制條件,不管條件真假,依然返回左表的全部行,可是會影響右表的匹配值。也就是說on中左表的限制條件隻影響右表的匹配內容,不影響返回行數。
結論:
1.where條件中對左表限制,不能放到on後面
2.where條件中對右表限制,放到on後面,會有數據行數差別,比原來行數要多