SQL中LEFT JOIN、RIGHT JOIN与INNER JOIN的区别解析

向北走
向北走
发布时间:2026-10-14| 6人浏览过
原创

在SQL数据库中处理多表关联查询时,经常需要理解不同JOIN语句的行为差异。本文通过实际案例深入解析LEFT JOIN、RIGHT JOIN和INNER JOIN的核心区别,帮助读者根据实际需求(如保留所有设备或所有软件)选择正确的数据组合策略,避免使用效率低下的临时数组替代方案。

1. 核心概念与底层逻辑

在多对多的业务场景中(例如按地区查询设备使用的软件列表),直接使用 IN 子句往往不是最优解。理解标准的多表连接(Join)是解决复杂数据组合的关键。这三种连接的主要区别在于哪些表的记录会被强制保留:

  • INNER JOIN(内连接/等值连接):仅返回两个表中联结字段相等的行。不匹配的记录将被完全丢弃。
  • LEFT JOIN(左连接):返回包括左表中的所有记录,以及右表中联结字段相等的记录。如果右表没有匹配,相应字段显示为 NULL。
  • RIGHT JOIN(右连接):返回包括右表中的所有记录,以及左表中联结字段相等的记录。如果左表没有匹配,相应字段显示为 NULL。

2. 实战演示与结果对比

为了直观理解,我们建立两张测试表进行联合查询对比。

准备条件:测试数据集

表A(设备表),主要字段为ID和名称:

aID | aNum
---|-----------
1  | a20050111
2  | a20050112
3  | a20050113
4  | a20050114
5  | a20050115

表B(软件表),主要字段为ID和名称:

bID | bName
----|-------------
1   | 2006032401
2   | 2006032402
3   | 2006032403
4   | 2006032404
8   | 2006032408

观察可见:aID 1-4 与 bID 1-4 匹配;表A独有 aID 5;表B独有 bID 8。

第1步:执行 Left Join 左连接

目的:获取全部设备信息,并查看它们对应的软件。

SQL语句:

SELECT * FROM A LEFT JOIN B ON A.aID = B.bID;

运行结果:

aID | aNum       | bID   | bName      
----|------------|-------|-------------
1   | a20050111  | 1     | 2006032401
2   | a20050112  | 2     | 2006032402
3   | a20050113  | 3     | 2006032403
4   | a20050114  | 4     | 2006032404
5   | a20050115  | NULL  | NULL

分析:以左表(A)为准,共5行。由于aID 5在右表(B)中没有匹配项,故bID和bName均为 NULL。

第2步:执行 Right Join 右连接

目的:获取全部软件信息,并查看它们对应的设备。

SQL语句:

SELECT * FROM A RIGHT JOIN B ON A.aID = B.bID;

运行结果:

aID | aNum       | bID   | bName      
----|------------|-------|-------------
1   | a20050111  | 1     | 2006032401
2   | a20050112  | 2     | 2006032402
3   | a20050113  | 3     | 2006032403
4   | a20050114  | 4     | 2006032404
NULL| NULL       | 8     | 2006032408

分析:以右表(B)为准,共5行。由于bID 8在左表(A)中没有匹配项,故aID和aNum均为 NULL。

第3步:执行 Inner Join 内连接

目的:仅寻找同时拥有设备和软件的记录。

SQL语句:

SELECT * FROM A INNER JOIN B ON A.aID = B.bID;

运行结果:

aID | aNum       | bID   | bName      
----|------------|-------|-------------
1   | a20050111  | 1     | 2006032401
2   | a20050112  | 2     | 2006032402
3   | a20050113  | 3     | 2006032403
4   | a20050114  | 4     | 2006032404

分析:只显示满足条件的4条记录。aID 5(无对应软件)和 bID 8(无对应设备)均被过滤掉。

3. 业务应用与最佳实践

回到最初的场景:我们需要“按省份和城市来查询软件列表”。这意味着无论设备是否安装了软件,该设备的地理位置信息都是必须存在的。此时应优先使用 INNER JOIN 配合筛选条件:

SELECT 软件表.软件 
FROM 软件表 
INNER JOIN 设备表 ON 软件表.mac = 设备表.mac 
WHERE 设备表.pro = 'xx' AND 设备表.city = 'yy';

这种写法利用了连接表的索引特性,比先查出MAC地址数组再使用 IN 查询的方式更加规范且易于优化。此外,在执行涉及数据覆盖或删除操作前,务必进行数据备份。

总结

掌握这三种连接的本质差异,能够大幅提升数据处理效率。简单来说:Left Join保左边,Right Join保右边,Inner Join只看交集。以上就是 SQL之left join、right join、inner join的区别浅析的详细内容,更多关于SQL多表连接操作的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。