mysql使用left join須要注意的點

含義: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後面,會有數據行數差別,比原來行數要多

相關文章
相關標籤/搜索