一个一直我困扰很久的问题,SQL语句中这两种写法有什么区别吗?
select * from a,b where a.id = b.id
select * from a inner join b on a.id =b.id
查询结果是一样的
那么,连接查询join后的限制条件 on 和where又有什么区别呢?
用left join做实验比较清楚
select * from a,b where a.id between 1000 and 2000
select * form a left join b on a.id between 1000 and 2000
可以看到
第一句SQL查询了所有a表,b表查询项目仅限于1表中a.id在1000~2000之间的,on关键字筛选了a表的结果将b表连接到了与a表结果匹配的行
如果要得到等同于第一句的SQL
需要再添加where条件
select * from a,b where a.id between 1000 and 2000
select * form a left join b on a.id between 1000 and 2000 where a.id between 1000 and 2000
另外一点发现:
对于left join,不管on后面跟什么条件,左表的数据全部查出来,因此要想过滤需把条件放到where后面。
where条件是在联合条件临时表生成好后,再对临时表进行过滤的条件,如果过滤的是左连接的主表,则没有问题,如果过滤的是左连接的从表,那前面的left join 就没有了意义,查询等同于inner join;过滤条件放在 where后面:是先连接然生成临时查询结果,然后再筛选
过滤条件放在 on后面:先根据条件过滤筛选,再连,生成临时查询结果