MySQL内连接、左连接与右连接的区别及实例解析

陈默
陈默
发布时间:2026-10-13 | 6人浏览过
原创

MySQL提供了多种多表连接方式以处理不同场景下的数据检索需求。内连接仅返回两表中关联字段匹配的行;左连接以左表为主,返回左表所有行及右表匹配项,无匹配则右侧填NULL;右连接反之。理解这些差异有助于编写准确的查询语句。

准备环境:构建测试数据

为了直观展示三种连接方式的执行结果,首先创建两个包含人员和城市信息的测试表 table1 和 table2。以下是完整的建表与插入数据的SQL脚本:

drop table if exists table1;
CREATE TABLE `andrew`.`table1`
(
`name` VARCHAR(32) NOT NULL,
`city` VARCHAR(32) NOT NULL
)
ENGINE = MyISAM;

insert into TABLE1(name, city) values ('Person A', 'BJ');
insert into TABLE1(name, city) values ('Person B', 'BJ');
insert into TABLE1(name, city) values ('Person C', 'SH');
insert into TABLE1(name, city) values ('Person D', 'SZ');
commit;

drop table if exists table2;
CREATE TABLE `andrew`.`table2`
(
`name` VARCHAR(32) NOT NULL,
`city` VARCHAR(32) NOT NULL
)
ENGINE = MyISAM;

insert into TABLE2(name, city) values ('Person W', 'BJ');
insert into TABLE2(name, city) values ('Person X', 'SH');
insert into TABLE2(name, city) values ('Person Y', 'SH');
insert into TABLE2(name, city) values ('Person Z', 'NJ');
commit;

核心概念详解与操作结果

第1步:内连接(Inner Join)查询

目的:获取两个表中“城市”字段完全相同的记录,排除任何不匹配的数据。

SQL语法:SELECT * FROM table1 a INNER JOIN table2 b ON a.city = b.city;(省略INNER关键字默认为内连接)。

执行逻辑:只有当左表和右表的 city 值相等时,才会生成结果行。如果某条记录在另一表中找不到对应城市,该行将被剔除。

结果分析:

  • Person A/B (BJ) 与 Person W (BJ) 匹配。
  • Person C (SH) 与 Person X/Y (SH) 匹配,产生笛卡尔积式扩展(一条左表记录对应多条右表记录)。
  • Person D (SZ) 和 Person Z (NJ) 因无对应匹配城市,不出现在结果中。

第2步:左连接(Left Join)查询

目的:保留左表 table1 的所有记录,无论右表是否有匹配项。

SQL语法:SELECT * FROM table1 a LEFT JOIN table2 b ON a.city = b.city;

执行逻辑:以左表为驱动表。对于左表的每一行,查找右表中 city 相同的数据:

  1. 精确匹配且唯一:如 Person A 和 Person B (BJ),与 table2 中的 Person W 一一配对。
  2. 匹配多项:如 Person C (SH),因为 table2 中有两条 SH 记录(Person X, Person Y),所以会产生两条结果记录。
  3. 无匹配:如 Person D (SZ),table2 中无 SZ 记录,结果中该行的右表字段(name, city from b)全部填充为 NULL。

第3步:右连接(Right Join)查询

目的:保留右表 table2 的所有记录,无论左表是否有匹配项。

SQL语法:SELECT * FROM table1 a RIGHT JOIN table2 b ON a.city = b.city;

执行逻辑:以右表为驱动表,逻辑与左连接相反:

  1. 精确匹配且唯一:如 Person X 和 Person Y (SH),与 table1 中的 Person C 匹配。
  2. 匹配多项:如 Person W (BJ),因为 table1 中有两条 BJ 记录(Person A, Person B),所以会产生两条结果记录。
  3. 无匹配:如 Person Z (NJ),table1 中无 NJ 记录,结果中该行的左表字段(name, city from a)全部填充为 NULL。

关键注意事项与排错

在实际开发中,需要注意以下细节以避免逻辑错误:

  • 默认连接类型:直接使用 JOIN 关键字而不指定 LEFT、RIGHT 或 INNER 时,MySQL默认执行的是内连接。如需外连接,必须显式声明。
  • FULL JOIN支持:标准SQL中的 FULL OUTER JOIN 用于返回左右两张表中的所有记录,但在MySQL中并不直接支持此语法。若需模拟类似效果,通常需要使用 UNION 结合左连接和右连接来实现。
  • NULL值处理:在外连接产生的空匹配字段为 NULL。在使用 COUNT() 或其他聚合函数时,需注意 NULL 不参与计算的特性,或使用 IFNULL()/COALESCE() 函数进行预处理。

简要总结

内连接关注“交集”,左连接保障“左全有”,右连接保障“右全有”。选择哪种连接方式取决于业务是只关心共同数据,还是需要保留一方缺失的记录以便后续审计或统计。以上就是MySQL左连接右连接和内连接的详解及区别的详细内容,更多关于MySQL连接查询优化的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表