MySQL中数据表的外连接怎么使用
在IT行业这个发展更新速度很快的行业,只有不停止的学习,才不会被行业所淘汰。如果你是数据库学习者,那么本文《MySQL中数据表的外连接怎么使用》就很适合你!本篇内容主要包括##content_title##,希望对大家的知识积累有所帮助,助力实战开发!
为什么要使用外连接
在解释为什么使用 “外连接” 之前,先来看一个记录。(如下:)

针对表中的张三没有所属的部门编号,我们暂且将他归类为 “临时工” ,没有固定的部门编制。
介于如此的场景,那么问题就出现了。当我们想要查询每一名员工和他的所属部门的名称时,在使用内连接的情况下,因为我们的链接条件是` “员工表” 的 “部门编号” = “部门表” 的 “部门编号” ,就会将 “张三” 漏掉。虽然说 “张三” 没有 “部门编号” ,但是他作为 “临时工” 也是公司的一员, 所以要引入外连接的语法才能解决这个问题,否则就会丢失一些符合逻辑的数据。
外连接简介
外连接与内连接的区别:
内连接的结果接中只会出现符合连接条件的记录,不符合连接条件的记录是绝对不会出现在结果集里面的。
外连接则显得很特殊,无论是否符合数据连接条件,都会出现在结果级里。(就比如上文提到的查询员工部门标号信息,因为 “张三” 没有部门编号,如果使用内连接,则 “张三” 就不符合 “连接条件”,也就不会出现在结果集里面;换做 “外连接” 就不会漏掉了。 )
外连接 例句 如下
SELECT e.empno, e.ename, d.dname FROM t_emp e LEFT JOIN t_dept d ON e.deptno = d.deptno; -- 在连接的时候仍然是链接 "员工表" 与 "部门表" ,只不过连接关键字由 "JOIN" 变成了 "LEFT JOIN" (下文再为大家详细解释) -- 两张表的连接条件还是使用 "ON" 关键字去连接的 , 连接条件依然是 "员工表" 的 "部门编号" = "部门表" 的 "部门编号" -- LEFT JOIN 为 "外连接" 的 "左外连接" ;(在 "外连接" 中,是分为 "左外连接" 与 "右外连接" 的) -- 在该SQL语句中 "LEFT JOIN" 左右各有数据表 "t_emp e" 与 "t_dept d" -- 所以这里的 "左连接" 的意思就是:保留 左表 的所有记录,然后与 右表 去连接,如果 右表 有符合条件的记录,则正常连接即可; -- 如果 右表 没有符合条件的连接记录, 右表 则展示 "NULL" 值与 "左表" 去匹配

左连接与右连接
“左连接” 也被称之为 “左外连接” ,就是保留左表所有的记录,与右表做连接。如果右表有符合条件的记录就与左表连接;如果右表没有符合条件的记录,就用 “NULL” 与左表连接。
区别于 “左连接” 的就是 “右连接”,“右连接” 与 “左连接” 相反,是保留 右表 的所有记录与 左表 的符合条件的记录进行连接;同样的,如果左表没有符合条件的记录,就用 “NULL” 与右表连接。
右连接 SQL 语句示例:
SELECT e.empno, e.ename, d.dname FROM t_dept d RIGHT JOIN t_emp e ON e.deptno = d.deptno; -- 这里有个需要注意的地方,就是相较于上文中的 "左连接" ,这里的 "右连接" 左右两张的表的位置做了调换

在这里,大家可以看到,仍然可以查出来 “张三” 的没有 “部门编号” 的记录。所以说 “左连接” 与 “右连接” 的区别并不是很大。
外连接练习①
查询每个部门的名称和部门的人数?
这道题看似简单,但是里面存在着两个难点,而且也存在容易出错的地方,详见下文 SQL 语句示例,与示意图。
SELECT d.deptno, d.dname, COUNT(*) FROM t_dept d LEFT JOIN t_emp e ON d.deptno = e.deptno GROUP BY d.deptno;

OK,问题就在这里开始出现了。
大家注意这里的 “40” - “OPERATIONS” 部门,这个部门实际上是没有人的,也就是人数为 “0” ,但是奇怪的是,这里进行统计的时候,却出现了统计人数 “1” ,这是为什么呢?
这是因为我们在使用分组的时候,用的是 “左连接” ,保留了左表的所有的数据,所以就按照左表的 “deptno” 进行分组。(因为是保留了左表的记录,所以分组也需要按照左表进行分组。);接下来重要的就是 “COUNT(*)” 这一部分了,“COUNT(*)” 统计的是所有的有效记录。所以当左表 “t_dept” 的所有记录与 右表 “t_emp” 进行连接的时候,右表 会使用 "NULL"值 与 左表 “t_dept” 连接,连接完之后就是一条有效的记录,如此既然是有效记录,那么 “COUNT(*)” 统计到的结果就是 “1”。
所以,如此统计到 40 部门的统计结果 为 “1” ,也是情有可原的,但是这个结果并不是我们想要的,要怎么去解决呢?参考下方的 SQL 语句。
SELECT d.deptno, d.dname, COUNT(e.deptno) FROM t_dept d LEFT JOIN t_emp e ON d.deptno = e.deptno GROUP BY d.deptno;

这个 SQL 语句还是非常不错的,有非常多的细节与未考虑到的情况,只有真正写一遍的时候才能会注意到这些袭击。
外连接练习②
查询每个部门的名称和部门的人数?如果是没有部门的员工,部门名称用 “NULL” 替代。(这里其实就是指的 "张三")
可能这里会觉得刚刚使用的是 "左外连接" 保留的部门表中所有的记录,这里直接换成 "右" 外连接不就行了么?其实...没那么简单。
这个练习的 SQL 语句需要使用到"UNION"关键字 去实现,利用"UNION" 关键字将多个查询语句的结果集进行并集的合并处理(排除重复内容)。
"UNION"关键字 在 SQL 语句中的用法如下:
(SQL查询语句) UNION (SQL查询语句) -- 如果存在多条查询语句的话,可以继续使用 UNION 关键字 连接
PS:这里需要注意一下,“UNION” 合并多少个结果集其实无所谓,关键是这些结果集的字段数量和字段的名称必须要相同 。如果说第一个 SQL 查询语句返回的是 10个 字段,第二个返回的是 2个字段 ,这种情况是完全没办法合并的。
(SELECT d.deptno, d.dname, COUNT(e.deptno) FROM t_dept d LEFT JOIN t_emp e ON d.deptno = e.deptno GROUP BY d.deptno) UNION (SELECT d.deptno, d.dname, COUNT(*) FROM t_dept d RIGHT JOIN t_emp e ON d.deptno = e.deptno GROUP BY d.deptno); -- 第一个查询语句,得到的结果集是各个部门的人数。 -- 第二个查询语句,得到的结果集是隶属于各个部门的人数,但是因为 "张三" 是一个没有部门所属的 "临时工" -- 所以两个查询语句的结果集合并之下没救如下图所示。

终于介绍完啦!小伙伴们,这篇关于《MySQL中数据表的外连接怎么使用》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布数据库相关知识,快来关注吧!
MySQL键值的示例分析
- 上一篇
- MySQL键值的示例分析
- 下一篇
- 电源浪涌后USB端口不工作?应用这些修复
-
- 数据库 · MySQL | 2天前 | MySQL · 索引 · 数据库优化 · MySQL索引 EXPLAIN ANALYZE Invisible Index
- 废弃 MySQL 索引怎么安全下线:先设 INVISIBLE,再用 EXPLAIN ANALYZE 验证
- 499浏览 收藏
-
- 数据库 · MySQL | 2天前 | MySQL · 数据库运维 · 分区表 · MySQL分区表 DROP PARTITION 历史数据清理
- MySQL 分区表清理历史数据为何越删越慢:DROP PARTITION 的锁与回收边界
- 316浏览 收藏
-
- 数据库 · MySQL | 3天前 |
- MySQL 8.4 索引跳过扫描怎么验收:复合索引缺首列时的适用边界
- 394浏览 收藏
-
- 数据库 · MySQL | 3天前 |
- MySQL 8.0 SKIP LOCKED 怎么做任务抢占:锁范围、空队列与重复消费验收
- 228浏览 收藏
-
- 数据库 · MySQL | 5天前 | MySQL · sql优化 · EXPLAIN ANALYZE · 性能验证 · 数据库排查 · mysql 执行计划 EXPLAIN ANALYZE 实际耗时 慢查询排查
- MySQL EXPLAIN ANALYZE 为什么比 EXPLAIN 慢:实际执行、耗时误读与线上验证
- 399浏览 收藏
-
- 数据库 · MySQL | 5天前 |
- MySQL 8.0 事件调度器做库存预占回收:幂等更新、锁边界与验收
- 492浏览 收藏
-
- 数据库 · MySQL | 2星期前 | MySQL · 查询优化 · 统计信息 · 性能排查 · 执行计划 EXPLAIN ANALYZE MySQL 8.0 直方图统计 ANALYZE TABLE
- MySQL 8.0 直方图统计何时能救回错误执行计划:从基线到验证
- 420浏览 收藏
-
- 数据库 · MySQL | 2星期前 | MySQL · 索引优化 · 数据库运维 · Invisible Index MySQL不可见索引 索引下线
- MySQL 不可见索引灰度验证:先观察优化器,再安全下线旧索引
- 401浏览 收藏
-
- 数据库 · MySQL | 2星期前 |
- MySQL LOAD DATA LOCAL INFILE 为什么要谨慎开启:从文件边界到双端校验
- 312浏览 收藏
-
- 数据库 · MySQL | 2星期前 | MySQL · SQL · 数据清理 · 窗口函数 MySQL 8.0 ROW_NUMBER 重复订单
- MySQL 8.0 窗口函数 ROW_NUMBER() 去重:保留最新订单,先查再删
- 471浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- ljg-skills
- ljg-skills 是李继刚开源的 AI 技能与提示词集合,面向大模型使用者整理了一批可复用的 prompt、角色设定和任务技能模板,适合用于学习提示词设计、搭建个人 AI 工作流和沉淀团队常用智能体能力。
- 4838次使用
-
- MELO音乐
- MELO音乐是一站式AI视频与音乐制作助手,对标suno, udio的高品质体验。提供伴奏生成、原创写词、无损导出、哼唱识曲、混音变声等全套音频与短视频编辑工具。无论是流行Kpop、电音说唱、民谣古风、摇滚儿歌还是商用轻音乐,MELO为你免费谱曲,轻松做同款!
- 4429次使用
-
- UniScribe
- UniScribe 是一款 AI 音视频转文字与内容整理工具,支持上传音频、视频文件或粘贴 YouTube 链接,自动生成转写文本、摘要、思维导图和关键问题,并支持多格式导出,适合会议记录、课程学习、访谈整理和内容创作复盘。
- 4369次使用
-
- 剧云
- 剧云是专业中文剧本创作平台,安全稳定运行十余年,集成AI编剧、剧本医生审核、人物小传、剧情关系图、大纲编写、多人协作、Word导入导出、版权管控功能,数据安全防护,轻松高效创作剧本。
- 4601次使用
-
- 万象有声
- 万象有声,一个专为有声创作者打造的新一代智能有声内容创作平台。平台提供专业的智能拆章、智能画本编辑、AI配音、AI生成音效、后期制作、智能对轨、智能审听等有声创作全流程工具,可以帮助创作者高效、低成本创作出引人入胜的有声作品。立即体验,让有声书制作更简单!
- 4557次使用
-
- MySQL权限管理设置全攻略
- 2026-03-29 501浏览
-
- MySQL分片实现方法及常见方案解析
- 2025-06-24 501浏览
-
- MySQL表空间碎片怎么清理?超详细优化教程
- 2025-06-13 501浏览
-
- MySQL排序性能优化技巧及方法
- 2025-06-04 501浏览
-
- MySQL建库建表全流程详解
- 2025-05-24 501浏览

