一个简单的例子:A、B表关联查询如下:
select * from A left join B
on A.a = B.b
where A.c = xx
分析:sql先执行select * from A left join B on A.a = B.b
,会将结果拼装成一个临时表,where的条件就是过滤临时表
,如果where中有B表的约束,则就相当于inner join了(原因:获取临时表中满足B表条件的数据,原本left join拼装的临时表包含在A所有行以及满足on后条件匹配到的B表的所有行(没有的则是null),所以如果where中有B的过滤条件,
select * from A left join B on A.a = B.b where A.c = xx and B.d = xx
可想而知null肯定都会被过滤,其对应的原本A表的数据也会被过滤,退化成inner join了)。
总之,on是创建临时表之前,而where是对临时表进行过滤,若想对B表过滤,则需要写在on之后,否则失去了使用left join的意义,如下:
select * from A left join B
on A.a = B.b
and B.d = xx
where A.c = xx