LEFT JOIN 左关联 ON条件的一些坑

直入主题,一开始我在使用 LEFT JOIN 使用的时候 ON 条件经常会添加一些 is_delete = 0 这类的条件,这样会存在一些坑。
下面我就说说在ON加条件参数和Where 后面加条件参数的区别

假设这里有两张表 t1和 t2 。t1 里面包含姓名, t2里面包含性别

t1_idnamet2_idis_delete
1xx10
2vv20
t2_idsexis_delete
11
20

下面我们写一个很常见的sql语句
查出所有人的姓名和性别:

SELECT
 	t1.name,
 	t2.sex
FROM t1 
LEFT JOIN t2 ON t1.t2_id = t2.t2_id
AND t2.is_delete = 0
WHERE
	t1.is_delete = 0

结果是什么呢?

在这里插入图片描述
是不是和我们想的不一样呢?我觉得下面这张图的效果才是我们一开始写代码想要的

SELECT
 	t1.name,
 	t2.sex
FROM t1 
LEFT JOIN t2 ON t1.t2_id = t2.t2_id
WHERE
	t1.is_delete = 0 AND t2.is_delete = 0

在这里插入图片描述
其实看到这里我们应该知道原因出在哪里了。

带大家回顾一下 == LEFT JOIN == 的知识

在这里插入图片描述
找了一张图,LEFT JOIN 的精髓就是以左边表为主,ON 后面的条件只是他们关联的条件,并不能sql结果。
再写个sql把所有字段都显示出来看看

SELECT
	*
FROM
	t1
LEFT JOIN t2 ON t1.t2_id = t2.t2_id

在这里插入图片描述
这个时候就已经把符合条件的数据都查了出来。无论ON 后面再加什么条件都不能改变结果个数。能改变的只是t2表查出来的数据是不是null

例如:

SELECT
	*
FROM
	t1
LEFT JOIN t2 ON t1.t2_id = t2.t2_id and t2.is_delete = 0

在这里插入图片描述

你们也可以自己试试

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值