新建两种表:用户表 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中的条件进行过滤得到最后结果