SQL 左连接、右连接与内连接解析

对比 SQL 左连接、右连接、内连接的含义、返回结果、使用场景、主表选择、on 与 where 条件差异和常见错误,帮助理解多表关联查询的核心逻辑。

袋鼠云
袋鼠云

SQL 多表查询中,左连接(Left join)、右连接(Right join)、内连接(Inner join)是最基础也最容易混淆的三种连接方式。它们的区别不在语法长短,而在未匹配数据是否保留、以哪张表为主以及连接条件如何影响结果。

内连接 Inner join

内连接只返回两张表中满足连接条件的记录。如果左表某行在右表找不到匹配,或右表某行在左表找不到匹配,都不会出现在结果中。

SELECT a.id, a.name, b.order_id
FROM users a
INNER JOIN orders b ON a.id = b.user_id;

这条 SQL 返回有订单的用户记录。如果业务要统计所有用户,包括没有订单的用户,内连接就不合适。

左连接 Left join

左连接以左表为基础,保留左表全部记录。右表能匹配则返回右表字段,不能匹配则右表字段为 NULL。

SELECT a.id, a.name, b.order_id
FROM users a
LEFT JOIN orders b ON a.id = b.user_id;

左连接常用于查找“主表全部对象及其关联信息”,例如所有用户及订单、所有商品及库存、所有部门及员工数量。它也常用于查找未匹配数据,例如筛选 b.order_id IS NULL 找出没有订单的用户。

右连接 Right join

右连接与左连接方向相反,以右表为基础,保留右表全部记录。很多场景可以通过交换表顺序,把 right join 改写为 left join,因此实际项目中 left join 更常见,可读性也更统一。

SELECT a.id, a.name, b.order_id
FROM users a
RIGHT JOIN orders b ON a.id = b.user_id;

这表示保留所有订单,即使某些订单找不到对应用户,也会出现在结果中。

on 与 where 的区别

外连接中,条件放在 on 还是 where 可能改变结果。on 影响连接匹配过程,where 会在连接完成后过滤结果。如果在 left join 后把右表条件写到 where,可能把未匹配的 NULL 行过滤掉,使结果变得像内连接。

因此,写外连接时要明确:条件是用于限制右表匹配范围,还是用于过滤最终结果。

常见误区

第一,连接字段不唯一会导致结果膨胀。例如用户表和订单表是一对多,连接后用户行会被订单数放大。第二,漏写连接条件会产生笛卡尔积。第三,只看语法不看业务主表,容易选择错误的连接方式。

理解 SQL 左连接、右连接、内连接的关键,是先确定“哪些记录必须保留”。如果只要匹配记录,用 inner join;如果要保留左侧全集,用 left join;如果要保留右侧全集,用 right join。这个判断比背诵定义更可靠。

开启Data+AI 之旅

填写表单,获取专属解决方案

400-002-1024

工作日 9:00-18:00

关注公众号

获取最新产品动态与技术干货

关注公众号

企业微信

扫码添加企业微信