MySQL LEFT JOIN 易混淆场景笔记
MySQL LEFT JOIN 易混淆场景笔记
一、核心区分两个完全不同的“删除”
1. 删除表内数据行(业务常规删除:DELETE / 软删除is_deleted=1)
场景:A=规则表,B=分类表,SQL:A LEFT JOIN B ON A.cat_id = B.id
- B表结构还存在,只是某条分类记录没了
- LEFT JOIN 保留左表A所有规则数据,不会丢失规则
- 匹配不到的分类字段全部返回 NULL
- 对应需求原话:即使分类被删除,规则数据依然展示
- 对比 INNER JOIN:分类记录删除后,对应规则直接查不到
2. DROP TABLE 彻底删除整张B表
场景:直接执行 DROP TABLE category;
- 数据库找不到B表结构
- SQL 直接报错:Table '库名.B表' doesn't exist
- 整条查询执行失败,接口500,无任何数据返回
- 线上高危操作,所有关联该JOIN的功能全部瘫痪
二、业务开发重点坑点(软删除必看)
错误写法(变相变成内连接,丢失主表数据)
SELECT * FROM rule r
LEFT JOIN category c ON r.category_id = c.id
WHERE c.is_deleted = 0;
原因:WHERE 过滤右表NULL数据,匹配不到分类的规则会被过滤掉
正确写法(过滤条件放ON后,不影响左表全量展示)
SELECT * FROM rule r
LEFT JOIN category c ON r.category_id = c.id AND c.is_deleted = 0;
三、极简记忆口诀
删行不删表 → LEFT JOIN 主表数据保留,关联字段NULL
删整张表 → SQL直接报错,查询完全失效

浙公网安备 33010602011771号