LEFT JOIN 左关联 ON条件的一些坑
直入主题,一开始我在使用 LEFT JOIN 使用的时候 ON 条件经常会添加一些 is_delete = 0 这类的条件,这样会存在一些坑。
下面我就说说在ON加条件参数和Where 后面加条件参数的区别
假设这里有两张表 t1和 t2 。t1 里面包含姓名, t2里面包含性别
| t1_id | name | t2_id | is_delete |
|---|---|---|---|
| 1 | xx | 1 | 0 |
| 2 | vv | 2 | 0 |
| t2_id | sex | is_delete |
|---|---|---|
| 1 | 男 | 1 |
| 2 | 女 | 0 |
下面我们写一个很常见的sql语句
查出所有人的姓名和性别:
SELECTt1.name,t2.sex
FROM t1
LEFT JOIN t2 ON t1.t2_id = t2.t2_id
AND t2.is_delete = 0
WHEREt1.is_delete = 0
结果是什么呢?

是不是和我们想的不一样呢?我觉得下面这张图的效果才是我们一开始写代码想要的
SELECTt1.name,t2.sex
FROM t1
LEFT JOIN t2 ON t1.t2_id = t2.t2_id
WHEREt1.is_delete = 0 AND t2.is_delete = 0

其实看到这里我们应该知道原因出在哪里了。
带大家回顾一下 == LEFT JOIN == 的知识

找了一张图,LEFT JOIN 的精髓就是以左边表为主,ON 后面的条件只是他们关联的条件,并不能sql结果。
再写个sql把所有字段都显示出来看看
SELECT*
FROMt1
LEFT JOIN t2 ON t1.t2_id = t2.t2_id

这个时候就已经把符合条件的数据都查了出来。无论ON 后面再加什么条件都不能改变结果个数。能改变的只是t2表查出来的数据是不是null
例如:
SELECT*
FROMt1
LEFT JOIN t2 ON t1.t2_id = t2.t2_id and t2.is_delete = 0

你们也可以自己试试
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
