SQL JOIN的核心是明确连接条件与驱动表关系,关键在确定保留哪边数据、空值处理及重复控制;INNER、LEFT、RIGHT、FULL OUTER四种JOIN本质区别在于基准表选择与匹配强制性。

SQL JOIN 语句不是“拼表”那么简单,核心在于明确连接条件 + 理解驱动表与被驱动表的关系。写对 JOIN,关键不是记语法,而是想清楚:我要保留哪边的数据?匹配不上时要不要留空?重复数据怎么处理?
JOIN 类型选对,结果才不会“丢行”或“多行”
最常见的四种 JOIN,本质区别就两点:以哪张表为基准(保留所有行)、是否要求两边都必须匹配。
- INNER JOIN:只保留两表都能匹配上的行。没匹配的全过滤掉,最常用也最安全。
- LEFT JOIN:以左表为基准,左表每行都保留;右表没匹配上就填 NULL。
- RIGHT JOIN:以右表为基准,逻辑同 LEFT,只是左右互换(实际中基本不用,用 LEFT 替代更清晰)。
- FULL OUTER JOIN:两边都不舍弃,没匹配上的各自补 NULL(MySQL 不原生支持,需用 LEFT + RIGHT + UNION 模拟)。
ON 条件写在哪,直接影响结果对不对
JOIN 后面的 ON 是连接逻辑的“开关”,它只管“怎么连”,不管“要不要留”。很多人把过滤条件错写在 ON 里,尤其在 LEFT JOIN 中,会导致语义错误。
- 正确做法:连接条件放 ON,比如 ON a.id = b.user_id;额外筛选放 WHERE,比如 WHERE b.status = 'active'。
- 陷阱示例:LEFT JOIN 时若把 b.status = 'active' 写进 ON,会导致右表不满足该条件的行仍被保留(只是字段为 NULL),但本意可能是“只要左表有,且右表存在 active 记录才关联”——这时就得用子查询或 WHERE 控制。
别忽略 NULL,JOIN 后常要处理“空值干扰”
LEFT / RIGHT / FULL JOIN 必然引入 NULL,它们会影响 COUNT、SUM、比较判断等操作。
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~