MySQL 左右内连接用法实例与原理详解

Felix
Felix
发布时间:2026-10-14| 5人浏览过
原创

在 MySQL 数据库操作中,连接(Join)是组合两个或多个表数据的核心手段。本文将通过构建具体的测试表和插入示例数据,详细解析左连接、右连接和内连接的语法结构、执行逻辑及返回结果,帮助开发者准确掌握不同场景下的 SQL 写法。

准备测试数据

为了直观展示三种连接的区别,我们创建两张简单的表:user_id 存储用户 ID 列表,user_profile 存储用户详细信息(ID 和名称)。请注意,部分 ID 在两表中都存在,部分仅存在于一张表中,且存在重复 ID,这将有助于观察连接行为。

-- 创建并填充 user_id 表
create table user_id ( id decimal(18) );
insert into user_id values (1), (2), (3), (4), (5), (6), (1);

-- 创建并填充 user_profile 表
create table user_profile ( id decimal(18) , name varchar(255) ) ;
insert into user_profile values 
(1, 'aa'), (2, 'bb'), (3, 'cc'), (4, 'dd'), 
(5, 'ee'), (5, 'EE'), (8, 'zz');

一、左连接(Left Join)

左连接以“左表”(即 FROM 子句后第一张表)为主。无论匹配与否,左表中的所有记录都会出现在结果集中。如果右表中没有对应的匹配记录,则右表的字段填充为 NULL(或根据 IFNULL 等函数处理)。

第1步:执行左连接查询

入口:MySQL 命令行或客户端工具。动作:执行以下 SQL 语句,观察 user_id 表中所有 ID 是否都出现在结果中:

select a.id id, ifnull(b.name, 'N/A') name 
from user_id a 
left join user_profile b on a.id = b.id;

完成状态:结果集包含 8 行记录。分析如下:

  • 完全匹配:如 ID 1, 2, 3, 4,左表和右表都有对应记录,正常显示 Name。
  • 多重匹配:如 ID 5,在 user_profile 中有两条记录('ee' 和 'EE'),因此结果集中会出现两行,体现笛卡尔积效应。
  • 无匹配:如 ID 6,在 user_profile 中不存在,故 name 显示为默认值 'N/A'。
  • 重复主键:ID 1 在 user_id 中出现两次,因此结果中 ID 1 也会对应出现两次相同的名称 'aa'。

应用场景:常用于查找“存在于 A 表但不存在于 B 表”的数据。例如,查询 user_id 中存在但 user_profile 中缺失的用户:

select count(*) from user_id left join user_profile on user_id.id = user_profile.id where user_profile.id is null;

二、右连接(Right Join)

右连接以“右表”(即 JOIN 子句后的第二张表)为主。无论匹配与否,右表中的所有记录都会出现在结果集中。如果左表中没有对应的匹配记录,则左表的字段填充为 NULL。

第1步:理解右连接逻辑

在上述例子中,右表是 user_profile。其核心逻辑与左连接对称:

  • 完全匹配:ID 2, 3, 4 正常显示。
  • 多重匹配:ID 1 在 user_id 中有两条记录(均为 'aa'),因此在结果中会产生两行关于 ID 1 的记录。
  • 无匹配:ID 8(名字 'zz')在 user_id 中不存在,结果中该行的左表字段(id)将显示为 NULL。
  • 注意:ID 6 不会出现在结果中,因为它属于左表且在右表中无匹配,而右连接只关心右表的完整性。

三、内连接(Inner Join)

内连接仅返回两个表中连接字段相匹配的行。结果集中不会出现任何一方字段为 NULL 的情况(除非匹配值本身为 NULL,但通常用于非空关联)。简单来说,内连接相当于去掉左连接或右连接中那些因无匹配而产生的补全行。

第1步:执行内连接查询

MySQL 中内连接可以通过 INNER JOIN ... ON 或旧的逗号语法配合 WHERE 条件实现:

-- 标准内连接语法
select * from user_id a inner join user_profile b on a.id = b.id;

-- 等价于隐式内连接
select * from user_id a, user_profile b where a.id = b.id;

完成状态:结果集包含 7 行记录。对比左连接(8行)和内连接的特点:

  • 剔除无匹配项:左表独有的 ID 6 被移除,右表独有的 ID 8 也被移除。
  • 保留交集:ID 1, 2, 3, 4, 5 均保留。同样,由于 ID 5 在右表有两条记录,结果中也会保留两行。

注意:MySQL 不支持 Full Outer Join(全外连接),若需实现类似效果,通常需要使用 Union All 结合 Left Join 和 Right Join 来模拟。

总结

掌握 MySQL 的左、右、内连接关键在于判断“谁保全部”。左连接保左表全貌,右连接保右表全貌,内连接仅留双方共鸣。在实际开发中,应根据业务需求选择连接类型,避免数据遗漏或冗余。以上就是关于 MySQL 左右内连接用法的详细内容,更多关于 MySQL 连接查询技巧的资料请关注本站其它相关文章!

相关标签:

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

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 算法库。