LEFT JOIN条件在on后面和在where后面的区别

一、left join 的实际运用

left join 一般用于显示左边所有数据,并携带右表的数据;
而在on后面进行条件过滤,只会过滤掉右表条件不为真的数据,左表数据一定会显示;
在where后面进行条件过滤,是对左表右表的结果表进行过滤,所以数据不一定能完全显示。

二、两表联查SQL区别

存在数据表test1, test4
test1:
在这里插入图片描述
test4:
在这里插入图片描述

1、在on后面补全条件

select * from test1 left join test4 on test1.id = test4.id and test4.is_effective = 1

在这里插入图片描述
可以发现test1中的数据全部被读取,test4中过滤了is_effective != 1的数据

2、在where后面补全条件

select * from test1 left join test4 on test1.id = test4.id where test4.is_effective = 1

在这里插入图片描述
可以发现只显示了test1中的id为1的数据内容。

三、三表联查SQL区别

存在test1,test2,test3三张表,其中test3是test1和test2的中间表
test1:
在这里插入图片描述
test2:
在这里插入图片描述
test3:
在这里插入图片描述

某些业务中,我们会使用中间表查询数据,如果存在业务,要显示test1中的全部数据,并携带test2中的有效数据,我们一般会采用left join 去完成sql,而这时需要注意应该将test2和test3的结果表作为整个右表,才能正常完成业务。

1.错误示范:

1.1 连续使用left join,on后面过滤条件

SELECT
	* 
FROM
	test1
	LEFT JOIN test3 ON test1.id = test3.id1
	LEFT JOIN test2 ON test2.id = test3.id2 and is_effective = 1

在这里插入图片描述
会查出test1中的重复数据

1.2 连续使用left join,where后面过滤条件

SELECT
	* 
FROM
	test1
	LEFT JOIN test3 ON test1.id = test3.id1
	LEFT JOIN test2 ON test2.id = test3.id2 
WHERE
	is_effective = 1

在这里插入图片描述
无法完全显示test1中的数据

2.正确操作:

2.1将test2和test3作为整个右表查询

SELECT
	* 
FROM
	test1
	LEFT JOIN ( SELECT * FROM test2 INNER JOIN test3 ON test2.id = test3.id2 WHERE is_effective = 1 ) b ON test1.id = b.id1

在这里插入图片描述
正常完成查询

四、结论

1.用left join 进行条件过滤时,on条件只会对右表进行条件过滤,不会对左表数据产生任何影响;
2.用left join 进行条件过滤时,where条件会对结果表进行条件过滤,所以会对左表数据产生影响;
3.用inner join 用on和where没有任何区别

  • 23
    点赞
  • 80
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值