兩者都是從字面上不同。
第一個查詢在進行表連接之前進行表t2
的過濾。所以結果將被加入表t1
,導致所有記錄t1
將顯示在列表中。
第二個從加入表格後的總結果過濾完成。
下面是一個例子
表1
ID Name
1 Stack
2 Over
3 Flow
表2
T1_ID Score
1 10
2 20
3 30
在第一個查詢,它看起來像這樣,
SELECT a.*, b.Score
FROM Table1 a
LEFT JOIN Table2 b
ON a.ID = b.T1_ID AND
b.Score >= 20
它在加入表之前,首先按照得分過濾table2
的記錄。因此,將表1上被連接的唯一記錄
T1_ID Score
2 20
3 30
因爲T1_ID
的Score
只有10。查詢的結果是
ID Name Score
1 Stack NULL
2 Over 20
3 Flow 30
而第二個查詢是不同的。
SELECT a.*, b.Score
FROM Table1 a
LEFT JOIN Table2 b
ON a.ID = b.T1_ID
WHERE b.Score >= 20
它首先加入記錄是否在另一張桌子上有匹配的記錄。因此,其結果將是
ID Name Score
1 Stack 10
2 Over 20
3 Flow 30
和過濾發生b.Score >= 20
。所以最終的結果將是
ID Name Score
2 Over 20
3 Flow 30
的'ON'減少那些正在參加行,而'WHERE'降低了集添加到結果集中的行... – Lucas
他們是不等價的。你的第一個查詢過濾了連接中的結果; *之後的第二個過濾器*。 –
我不確定問題是否相同,因爲這裏,條件表示在第二張表上。 –