news 2026/5/17 2:01:14

MySQL表的内连接与外连接详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MySQL表的内连接与外连接详解

1. 内连接(INNER JOIN)

1.1 基本概念

内连接是利用WHERE子句对两种表形成的笛卡尔积进行筛选,只返回两个表中连接字段相等的行。

1.2 语法格式

SELECT 字段 FROM 表1 INNER JOIN 表2 ON 连接条件 [AND 其他条件];

1.3 实际案例

显示SMITH的名字和部门名称

传统写法(我们之前学习的方式)
SELECT ename, dname FROM EMP, DEPT WHERE EMP.deptno = DEPT.deptno AND ename = 'SMITH';
标准内连接写法
SELECT ename, dname FROM EMP INNER JOIN DEPT ON EMP.deptno = DEPT.deptno WHERE ename = 'SMITH'; -- 或者将条件写在ON子句中 SELECT ename, dname FROM EMP INNER JOIN DEPT ON EMP.deptno = DEPT.deptno AND ename = 'SMITH';

1.4 内连接特点

  • 只显示两个表中匹配的记录

  • 不匹配的记录不会出现在结果中

  • 是开发中最常用的连接方式

2. 外连接(OUTER JOIN)

2.1 外连接概述

外连接分为左外连接和右外连接,用于显示不匹配的记录。

2.2 创建测试数据

-- 学生表 CREATE TABLE stu (id int, name varchar(30)); INSERT INTO stu VALUES (1, 'jack'), (2, 'tom'), (3, 'kity'), (4, 'nono'); -- 成绩表 CREATE TABLE exam (id int, grade int); INSERT INTO exam VALUES (1, 56), (2, 76), (11, 8);

3. 左外连接(LEFT JOIN)

3.1 基本概念

左外连接会返回左表的所有记录,以及右表中连接字段相等的记录。如果右表没有匹配的记录,则显示为NULL。

3.2 语法格式

SELECT 字段名 FROM 表名1 LEFT JOIN 表名2 ON 连接条件;

3.3 实际案例

查询所有学生的成绩,如果学生没有成绩,也要显示学生信息

SELECT * FROM stu LEFT JOIN exam ON stu.id = exam.id;

查询结果示例:

+------+------+------+-------+ | id | name | id | grade | +------+------+------+-------+ | 1 | jack | 1 | 56 | | 2 | tom | 2 | 76 | | 3 | kity | NULL | NULL | -- 左表有记录,右表无匹配 | 4 | nono | NULL | NULL | -- 左表有记录,右表无匹配 +------+------+------+-------+

3.4 左外连接特点

  • 左表记录全部显示

  • 右表只显示匹配的记录

  • 不匹配的右表字段显示为NULL

4. 右外连接(RIGHT JOIN)

4.1 基本概念

右外连接会返回右表的所有记录,以及左表中连接字段相等的记录。如果左表没有匹配的记录,则显示为NULL。

4.2 语法格式

SELECT 字段 FROM 表名1 RIGHT JOIN 表名2 ON 连接条件;

4.3 实际案例

显示所有成绩信息,即使没有对应的学生信息

SELECT * FROM stu RIGHT JOIN exam ON stu.id = exam.id;

查询结果示例:

+------+------+------+-------+ | id | name | id | grade | +------+------+------+-------+ | 1 | jack | 1 | 56 | | 2 | tom | 2 | 76 | | NULL | NULL | 11 | 8 | -- 右表有记录,左表无匹配 +------+------+------+-------+

5. 综合练习与应用

5.1 实际业务场景

列出部门名称和员工信息,同时显示没有员工的部门

方法一:使用左外连接
SELECT d.dname, e.* FROM dept d LEFT JOIN emp e ON d.deptno = e.deptno;
方法二:使用右外连接
SELECT d.dname, e.* FROM emp e RIGHT JOIN dept d ON d.deptno = e.deptno;

5.2 多表外连接应用

-- 显示所有部门、员工及工资等级信息 SELECT d.dname, e.ename, e.sal, s.grade FROM dept d LEFT JOIN emp e ON d.deptno = e.deptno LEFT JOIN salgrade s ON e.sal BETWEEN s.losal AND s.hisal;

6. 连接类型对比总结

连接类型

语法

结果描述

使用场景

内连接

INNER JOIN

只返回两个表匹配的记录

需要完全匹配的数据

左外连接

LEFT JOIN

返回左表全部+右表匹配记录

需要显示主表所有记录

右外连接

RIGHT JOIN

返回右表全部+左表匹配记录

需要显示从表所有记录

7. 实战技巧与注意事项

7.1 性能优化建议

-- 好的实践:在连接条件上使用索引 SELECT * FROM emp e INNER JOIN dept d ON e.deptno = d.deptno -- deptno字段应该有索引 WHERE e.sal > 2000; -- 避免在连接条件中使用函数 SELECT * FROM emp e INNER JOIN dept d ON e.deptno = d.deptno -- 好 -- 而不是:ON YEAR(e.hiredate) = YEAR(d.create_date) -- 不好

7.2 复杂连接查询示例

-- 查询每个部门的员工数量(包括没有员工的部门) SELECT d.dname, COUNT(e.empno) as employee_count FROM dept d LEFT JOIN emp e ON d.deptno = e.deptno GROUP BY d.deptno, d.dname; -- 查询没有员工的部门 SELECT d.dname FROM dept d LEFT JOIN emp e ON d.deptno = e.deptno WHERE e.empno IS NULL;

8. LeetCode实战题目

8.1 题目类型分析

  • rank-scores:需要使用自连接或窗口函数进行排名

  • exchange-seats:需要使用CASE语句和自连接进行座位交换

8.2 解题思路示例

-- 类似rank-scores的解法思路 SELECT s1.score, COUNT(DISTINCT s2.score) as 'rank' FROM scores s1, scores s2 WHERE s1.score <= s2.score GROUP BY s1.id ORDER BY s1.score DESC;

9. 总结

9.1 核心要点

  1. 内连接:求交集,最常用

  2. 左外连接:保留左表全部记录

  3. 右外连接:保留右表全部记录

  4. 实际开发中根据业务需求选择合适的连接方式

9.2 选择指南

  • 需要完全匹配的数据 → 使用INNER JOIN

  • 需要显示主表所有记录(如:所有学生) → 使用LEFT JOIN

  • 需要显示从表所有记录(如:所有成绩) → 使用RIGHT JOIN

  • 多表连接时注意连接顺序和性能影响

掌握这些连接方式后,能够处理各种复杂的数据查询需求,是数据库开发的重要技能。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/17 1:13:43

【开题答辩全过程】以 高校食堂餐饮管理系统的设计与实现为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人&#xff0c;语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…

作者头像 李华
网站建设 2026/5/8 17:20:08

智能制造质量控制AI系统的微服务架构:AI应用架构师的拆分与通信实践

智能制造质量控制AI系统的微服务架构&#xff1a;架构师的拆分技巧与通信实践 一、标题选项 《智能制造质量控制AI系统的微服务架构设计&#xff1a;从业务拆分到通信实现》《AI微服务&#xff1a;打造高可用智能制造质量控制体系的实践指南》《智能制造质量控制系统的微服务…

作者头像 李华
网站建设 2026/5/10 0:18:02

目前AI编程工具哪个最好用?

现在最好用的无非是国外的Claude Code、Cursor&#xff0c;以及国内刚刚起步的Trae&#xff0c;但Trae无法调用Claude模型&#xff0c;比如号称最强AI编程的Claude Opus&#xff0c;所以相比Claude Code、Cursor体验还略逊一筹。 Claude Code的好处在于上下文能力强&#xff0…

作者头像 李华
网站建设 2026/5/15 14:17:28

AI效率加速器工具的基础版与专业版功能差异:10款工具详解

&#xfffd;&#xfffd; 10大降AIGC平台核心对比速览 排名 工具名称 降AIGC效率 适用场景 免费/付费 1 askpaper ⭐⭐⭐⭐⭐ 学术论文精准降AI 付费 2 秒篇 ⭐⭐⭐⭐⭐ 快速降AIGC降重 付费 3 Aibiye ⭐⭐⭐⭐ 多学科论文降AI 付费 4 Aicheck ⭐⭐⭐⭐…

作者头像 李华
网站建设 2026/5/17 0:09:45

借助 Kafka 提升大数据平台的实时响应能力

从离线到实时:用Kafka重构大数据平台的响应能力 引言:你也在为“数据延迟”头疼吗? 凌晨3点,电商运营小张揉着眼睛盯着屏幕——昨天大促的销售报表终于跑出来了,但页面上“库存预警”的红色数字让他倒吸一口凉气:某款爆品的库存已经售罄2小时,而离线系统直到现在才提示…

作者头像 李华
网站建设 2026/5/16 7:00:27

数据资产治理:提升数据质量的5大策略

数据资产治理实战&#xff1a;提升数据质量的5大核心策略&#xff08;附落地指南&#xff09; 引言&#xff1a;别让“坏数据”毁了你的业务 你有没有遇到过这样的场景&#xff1f; 市场部做活动复盘时&#xff0c;发现同一款产品的销售额在CRM系统和财务系统里差了20%&…

作者头像 李华