left join查询on后面的条件过滤失效的问题

新建两种表:用户表 tb_user 和订单表 tb_orderlist, 订单表中的uid字段关联用户表中的id字段
在这里插入图片描述
在这里插入图片描述
1, 直接在left join后面的on中加关联关系和过滤条件,查询结果如下图,可以看到on后面的过滤条件 u.id = 1并没有生效, uid = 2,3,4的数据都查询出来了

SELECT u.id,u.name,u.age,o.order_number,o.uid FROM tb_user u LEFT JOIN tb_orderlist o 
ON u.id = o.uid AND u.id = 1

查询结果如下:
在这里插入图片描述
2, 我们将 on后面的过滤条件换到where后面, 过滤条件 u.id = 1是生效的, 只查询出了uid = 1的数据

SELECT u.id,u.name,u.age,o.order_number,o.uid FROM tb_user u LEFT JOIN tb_orderlist o 
ON u.id = o.uid WHERE u.id = 1

查询结果如下图:
在这里插入图片描述
3, 我们将left join换成inner join,查询结果如下:过滤条件uid = 1是生效的

SELECT u.id,u.name,u.age,o.order_number,o.uid FROM tb_user u INNER JOIN tb_orderlist o 
ON u.id = o.uid and u.id = 1

查询结果如下图:
在这里插入图片描述
原因分析:
left join保证了会查询左表的全部行,即用户表tb_user表中的所有行,因此我们再在on后面使用 u.id = 1对 用户表tb_user表进行条件过滤是没有作用的,但是on后面如果使用 o.uid = 5对tb_orderlist表进行条件过滤又是有效的

SELECT u.id,u.name,u.age,o.order_number,o.uid FROM tb_user u LEFT JOIN tb_orderlist o 
ON u.id = o.uid and o.uid = 7

查询结果如下图:
在这里插入图片描述

为什么我们将过滤条件放在where后面又生效呢?
1. 在on后面加过滤条件,sql的执行步骤是先使用该条件对a表和b表先进行过滤,然后再将两张表中的记录按照关联关系生成最终结果
2. 在where后面加过滤条件,sql的执行步骤是先将a表和b表按照关联关系生成临时表,然后再将临时表按照where中的条件进行过滤得到最后结果

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值