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

在这里插入图片描述

你们也可以自己试试

### 如何在 MySQLLEFT JOIN 中使用 ON 子句添判断条件 当处理 `LEFT JOIN` 语句时,在 `ON` 子句中入特定的判断条件可以控制连接行为,从而精确地获取所需的数据集。对于从表(右侧表)而言,这些条件会在创建临时结果集的过程中应用;而对于主表(左侧表),即使不满足 `ON` 子句内的条件也会保留其所有的行。 考虑如下 SQL 查询结构: ```sql SELECT * FROM table_left AS t1 LEFT JOIN table_right AS t2 ON t1.id = t2.left_id AND t2.condition_column = 'specific_value'; ``` 此查询表示将基于两个表格之间的关系字段 (`id`) 进行联结操作的同时,附了一个额外的要求——只有当右边表中的某列(`condition_column`)等于指定值('specific_value')的时候才认为它们之间存在有效的关联[^4]。 需要注意的是,如果希望进一步对最终得到的结果施限制,则应该把这些逻辑放置于 `WHERE` 子句内而不是 `ON` 部分。因为前者是在整个联合过程结束后才生效,能够确保不会意外丢失任何来自左表的信息[^2]。 例如,假设有一个场景需要找出所有职位信息以及对应的职业需求为“程序员”的工作详情,但是某些职位可能暂时没有任何与之相匹配的工作描述。此时可以通过下面的方式实现这一目标: ```sql SELECT j.*, ji.* FROM jobinfo AS j LEFT JOIN jobdetails AS ji ON j.jobId = ji.jobInfoId AND ji.professionRequire = '程序员' WHERE j.status = 'open'; -- 主表上的过滤条件应放在此处 ``` 上述例子展示了如何利用 `AND` 关键字来组合多个条件到同一个 `ON` 子句里,并且说明了为何要区分哪些条件适合放在 `ON` 而不是 `WHERE`[^3]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值