两者在字面上是不同的。
第一个查询在表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
首先按分数过滤记录。因此,将在 table1 上连接的唯一记录是
T1_ID Score
2 20
3 30
因为Score
ofT1_ID
只有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