MySQL LEFT JOIN 易混淆场景笔记

MySQL LEFT JOIN 易混淆场景笔记

一、核心区分两个完全不同的“删除”

1. 删除表内数据行(业务常规删除:DELETE / 软删除is_deleted=1)

场景:A=规则表,B=分类表,SQL:A LEFT JOIN B ON A.cat_id = B.id

  1. B表结构还存在,只是某条分类记录没了
  2. LEFT JOIN 保留左表A所有规则数据,不会丢失规则
  3. 匹配不到的分类字段全部返回 NULL
  4. 对应需求原话:即使分类被删除,规则数据依然展示
  5. 对比 INNER JOIN:分类记录删除后,对应规则直接查不到

2. DROP TABLE 彻底删除整张B表

场景:直接执行 DROP TABLE category;

  1. 数据库找不到B表结构
  2. SQL 直接报错:Table '库名.B表' doesn't exist
  3. 整条查询执行失败,接口500,无任何数据返回
  4. 线上高危操作,所有关联该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直接报错,查询完全失效

posted @ 2026-06-23 10:10  堭鍙銤  阅读(11)  评论(0)    收藏  举报