首先,需要注意的是,使用LEFT JOIN進行連接查詢時,不論ON條件是否爲真,都會返回左表的所有記錄
- ON條件是生成臨時表時使用的條件(僅在關聯右表查詢時對右表篩選起作用,無論條件是否爲真都會返回左表所有記錄)
- 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 ,僅有一條全表記錄符合條件;