1. 程式人生 > >left join on和where

left join on和where

tab sid image 宋體 body 基礎上 連接 成績 生成

left join on:

向左關聯某個表記錄,意思是以左邊的表記錄為基準,通過關聯條件會從左表返回所有的行,即使在右表中沒有匹配的行。

舉個例子:

select * from A left join B on A.id=B.id

說明:從A表左外聯接B表,基於A.id=B.id

和where的區別:

1.on條件是生成臨時表的條件,不管on中的條件是否成真,都會返回左邊表中的記錄(為null顯示)。

2.where條件是建立在臨時表生成好基礎上再對臨時表過濾的條件,已經沒有left join的含義(必須返回左邊表的記錄),條件不符合就全部過濾。

假設兩張表,

表1-tab1: 表2-tab2:

id name name class

1 10 10 AA

2 20 20 BB

3 30 20 CC

SQL語句:

1.select * from tab1 left join tab2 on (tab1.name=tab2.name) where tab2.class=‘AA‘

2.select * from tab1 left join tab2 on (tab1.name=tab2.name and tab2.class=‘AA‘)

SQL1結果:

1.on的條件為tab1.name=tab2.name,以tab1表為基準,返回所有的值

tab1.id tab1.name tab2.name tab2.class

1 10 10 AA

2 20 20 BB

2 20 20 CC

3 30 NULL NULL

2.WHERE後的條件tab2.class=‘AA‘,查詢結果為

tab1.id tab1.name tab2.name tab2.class

1 10 10 AA

SQL2結果:

on的條件為tab1.name=tab2.name and tab2.class=‘AA‘

,以tab1表為基準返回所有的值

tab1.id tab1.name tab2.name tab2.class

1 10 10 AA

2 20 NULL NULL

3 30 NULL NULL

比較以下sql區別:

查詢有課程成績小於60分的同學的學號、姓名,

技術分享圖片技術分享圖片

--以student_id分組:

SELECT student_id,sname FROM test_score s,test_student t WHERE s.num<‘60‘ AND s.student_id=t.sid GROUP BY student_id;

--按student_id去重:

SELECT DISTINCT student_id,sname FROM test_score s,test_student t WHERE s.num<‘60‘ AND s.student_id=t.sid;

--以left join左連接

SELECT DISTINCT student_id,sname FROM test_student t LEFT JOIN test_score s ON s.student_id=t.sid WHERE s.num<‘60‘;

left join on和where