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后面,就会把这些数据过滤掉)。