【SQL】条件放on和where后的差别

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条件是在临时表生成后,再对临时表进行过滤的条件。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值