left join on 后and 和 where 的区别

left join on 后and 和 where 的区别

LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,on是在生成临时表的时候使用的条件,不管on的条件是否起到作用,都会返回左表 (table_name1) 的行。on 后面的and是对右表的数据进行过滤,不会过滤左表数据。

where则是在生成临时表之后使用的条件,此时已经不管是否使用了left join了,只要条件不为真的行,全部过滤掉,是对最终的结果集进行过滤的。

测试

表1:table2

id No
1 1
2 2
3 3

表2:table2

No name
1 a
2 b
3 c
select a.id,a.No,b.name from table1 a left join table2 b on a.No = b.No and b.name='a';
select a.id,a.No,b.name from table1 a left join table2 b on a.No = b.No where b.name='a';

第一个结果集:

|id |No |name|
|---|---|---|
|1  |1 |a|
|2  |2 |(Null)|
|3  |3 |(Null)|    

第二个结果集:

|id |No |name|
|---|---|---|
|1  |1 |a|

on会首先过滤掉不符合条件的行,然后才会进行其它运算

在多表查询时,on比where更早起作用。系统首先根据各个表之间的联接条件,把多个表合成一个临时表后,再由where进行过滤,然后再计算,计算完后再由having进行过滤。由此可见,要想过滤条件起到正确的作用,首先要明白这个条件应该在什么时候起作用,然后再决定放在那里。

对于JOIN参与的表的关联操作,如果需要不满足连接条件的行也在我们的查询范围内的话,我们就必需把连接条件放在ON后面,而不能放在WHERE后面(连接条件放在on后面,不满足连接表的会以null形式显示,如果放在where后面,就会把这些数据过滤掉)