mysql使用left join需要注意的點


含義:LEFT JOIN 關鍵字會從左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中沒有匹配的行。

Mysql對於left join采用類似嵌套循環的方式進行處理,例如:

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

其中p1on的過濾條件,缺失則認為ruep2where過濾條件,缺失也認為是true,該語句的執行邏輯可以描述為:

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補上的行
  }
 }
}

從中可以看出兩點:

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

2、如果沒有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后面,會有數據行數差異,比原來行數要多


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM