LEFT JOIN關聯查詢中ON條件和WHERE條件淺析

首先,需要注意的是,使用LEFT JOIN進行連接查詢時,不論ON條件是否爲真,都會返回左表的所有記錄

 

  1.  ON條件是生成臨時表時使用的條件(僅在關聯右表查詢時對右表篩選起作用,無論條件是否爲真都會返回左表所有記錄)
  2. WHERE條件是生成臨時表後使用的條件(對生成的臨時表再次進行條件過濾,此時條件篩選對全表有效,條件不爲真就會過濾掉)

假設我們有class表和achieve表,分別是班級表和成績表

class表(班級表)

班級(class) 成員(student)
一班 張三
二班 李四
三班 王五

achieve表(成績表)

成員(student) 課程(courses) 成績(result)
張三 語文 70
李四 數學 85
李四 英語 90

 

  • 僅on條件關聯查詢
select * from class a left join achieve b on a.student = b.student;
a.class a.student b.student b.courses b.result
一班 張三 張三 語文 70
二班 李四 李四 數學 85
二班 李四 李四 英語 90
三班 王五      
  • on條件關聯查詢 + on條件篩選(右表篩選條件) 
select * from class a left join achieve b on a.student = b.student and b.result = 70;
a.class a.student b.student b.courses b.result
一班 張三 張三 語文 70
二班 李四      
三班 王五      

注:根據left join on條件的關聯查詢規則,會取左表所有記錄,再與右表關聯記錄時,會限制右表b.result = 70,故右表僅有一條記錄符合條件;

  • on條件關聯查詢 + on條件篩選(左表篩選條件)
select * from class a left join achieve b on a.student = b.student and a.student = '李四';

 

a.class a.student b.student b.courses b.result
一班 張三      
二班 李四 李四 數學 85
二班 李四 李四 英語 90
三班 王五      

注:根據left join on條件的關聯查詢規則,會取左表所有記錄,再與右表關聯記錄時,會限制左表a.student = '李四'去關聯右表,故右表僅有b.student = ‘李四’ 的兩條記錄符合條件;

  • on條件關聯查詢 + where條件篩選
select * from class a left join achieve b on a.student = b.student where b.result = 70;
a.class a.student b.student b.courses b.result
一班 張三 張三 語文 70

注:根據left join on條件的關聯查詢規則,會取左表所有記錄,再與右表關聯記錄;然後where條件會對關聯後的全表進行篩選,此時再篩選b.student = 70 ,僅有一條全表記錄符合條件;

發佈了28 篇原創文章 · 獲贊 11 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章