sql中的连接查询分为3种, cross join,inner join,和outer join 。
在 cross join和inner join中,筛选条件放在on后面还是where后面是没区别的;在outer join中,也就是平时最常使用的left join和right join,存在差别。
outer join 的执行过程分为4步:
1、先对两个表执行交叉连接(笛卡尔积)
2、应用on筛选器
3、添加外部行
4、应用where筛选器
一般会在第三步造成差别,下面为实例:
1.student表:(主表)
2.sc表,学生成绩表
左连接
select * from student s
left join sc
on s.SId=sc.SId;
在on后加筛选条件
select * from student s
left join sc
on s.SId=sc.SId and sc.cid=1;
加入where筛选条件:
select * from student s
left join sc
on s.SId=sc.SId
where sc.cid=1;
我们可以发现筛选条件在on后时,有种画蛇添足的感觉,07-10行不是我们想要的结果。这是因为第三步添加外部行时以student表为基,假如另一侧的表没有符合on筛选条件的记录,则以null替代。如果再加入where筛选,即可把07-10不符合条件的记录删除。
总结:
在 cross join和inner join中,筛选条件放在on后面还是where后面是没区别的;在outer join中,也就是平时最常使用的left join和right join,存在差别。
on是在生成临时表时使用的条件,不管on中的条件是否为真,都会返回左表的记录。
where条件是在临时表生成后,再对临时表进行过滤的条件。