SQL多表连接核心在于明确保留哪边数据及处理不匹配情况:INNER JOIN仅保留两边均有匹配的记录;LEFT JOIN保留左表全部记录,右表无匹配则填NULL;RIGHT JOIN与FULL JOIN使用较少,MySQL不支持FULL JOIN;自连接需用别名区分同一表的不同角色,多表连接应逐级明确ON条件。

SQL多表连接的核心,是通过关联字段把不同表的数据拼在一起查。关键不在记住所有JOIN名称,而在于理解“要保留哪边的数据”和“匹配不上怎么办”这两个问题。
INNER JOIN:只留两边都有的记录
这是最常用的连接方式,结果中每行数据在左表和右表里都必须有对应匹配项。如果某条订单没有对应的客户信息,这条订单就不会出现在结果里。
- 写法简洁:可直接写 JOIN,默认就是 INNER JOIN
- 条件写在 ON 后面,不是 WHERE(WHERE 是连接完再过滤)
- 字段名重复时,必须用 表名.字段名 明确指定,比如 orders.user_id 和 users.id
LEFT JOIN:左边全保留,右边没匹配就填 NULL
想看所有用户,不管他们有没有下过订单,就用 LEFT JOIN。左表(users)的每一行都会出现,右表(orders)没匹配上的字段显示为 NULL。
- LEFT 可以换成 LEFT OUTER JOIN,效果一样,“OUTER”通常省略
- 注意方向:FROM users LEFT JOIN orders 表示以 users 为主
- 如果后续加 WHERE 条件筛右表字段(如 WHERE orders.status = 'paid'),会把原本 NULL 的行也过滤掉——需要改成 AND orders.status = 'paid' 放在 ON 后面才对
RIGHT JOIN 和 FULL JOIN:用得少,但逻辑要清楚
RIGHT JOIN 就是 LEFT JOIN 换个方向,日常几乎不用,因为改写成 LEFT JOIN 更直观。FULL JOIN 返回左右两边所有记录,匹配不上的补 NULL,MySQL 不支持,PostgreSQL、SQL Server、Oracle 可用。
- MySQL 用户想实现类似 FULL JOIN 效果,得用 LEFT JOIN + RIGHT JOIN + UNION 拼接
- 实际业务中,FULL JOIN 使用场景有限,多数时候用 LEFT 或 INNER 就够了
自连接和多表连接:一次查多个表不难
一张表可以自己连自己,比如查员工和直属上级的名字(都存在 employee 表里)。多表连接就是连续写 JOIN,每次 ON 一个关联条件。
- 自连接要给表起别名,比如 e1 AS employee 和 e2 AS manager
- 三张表连接:FROM a JOIN b ON a.id = b.a_id JOIN c ON b.id = c.b_id
- 别让 ON 条件串错关系,建议一边写一边画字段对应关系
基本上就这些。JOIN 不复杂但容易忽略细节,重点是动手试,用小数据验证结果是否符合预期。










