当前位置:

首页 > 编程开发 > MySQL中数据表的外连接怎么使用

MySQL中数据表的外连接怎么使用

本文目录

    为什么要使用外连接在解释为什么使用“外连接”之前,先来看一个记录。(如下:)针对表中的张三没有所属的部门编号,我们暂且将他归类为“临时工”,没有固定的部门编制。介于如此的场景,那么问题就出现了。当我们想要查询每一名员工和他的所属部门的名称时,在使用内连接的情况下,因为我们的链接条件是`“员工表”的“部门编号”=“部门表”的“部门编号”,就会将“张三”漏掉。虽然说“张三”没有“部门编号”,但是他作为“临时工”也是公司的一员,所以要引入外连接的语法才能解决这个问题,否则就会丢失一些符合逻辑的数据。外连接简介外

    为什么要使用外连接

    在解释为什么使用 “外连接” 之前,先来看一个记录。(如下:)

    MySQL中数据表的外连接怎么使用

    针对表中的张三没有所属的部门编号,我们暂且将他归类为 “临时工” ,没有固定的部门编制。

    介于如此的场景,那么问题就出现了。当我们想要查询每一名员工和他的所属部门的名称时,在使用内连接的情况下,因为我们的链接条件是` “员工表” 的 “部门编号” = “部门表” 的 “部门编号” ,就会将 “张三” 漏掉。虽然说 “张三” 没有 “部门编号” ,但是他作为 “临时工” 也是公司的一员, 所以要引入外连接的语法才能解决这个问题,否则就会丢失一些符合逻辑的数据。

    外连接简介

    外连接与内连接的区别:

    内连接的结果接中只会出现符合连接条件的记录,不符合连接条件的记录是绝对不会出现在结果集里面的。

    外连接则显得很特殊,无论是否符合数据连接条件,都会出现在结果级里。(就比如上文提到的查询员工部门标号信息,因为 “张三” 没有部门编号,如果使用内连接,则 “张三” 就不符合 “连接条件”,也就不会出现在结果集里面;换做 “外连接” 就不会漏掉了。 )

    外连接 例句 如下

    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" 值与 "左表" 去匹配

    MySQL中数据表的外连接怎么使用

    左连接与右连接

    “左连接” 也被称之为 “左外连接” ,就是保留左表所有的记录,与右表做连接。如果右表有符合条件的记录就与左表连接;如果右表没有符合条件的记录,就用 “NULL” 与左表连接。

    区别于 “左连接” 的就是 “右连接”,“右连接” 与 “左连接” 相反,是保留 右表 的所有记录与 左表 的符合条件的记录进行连接;同样的,如果左表没有符合条件的记录,就用 “NULL” 与右表连接。

    右连接 SQL 语句示例:

    SELECT 
    	e.empno, e.ename, d.dname
    FROM
    	t_dept d
    RIGHT JOIN t_emp e ON e.deptno = d.deptno;
    
    -- 这里有个需要注意的地方,就是相较于上文中的 "左连接" ,这里的 "右连接" 左右两张的表的位置做了调换

    MySQL中数据表的外连接怎么使用

    在这里,大家可以看到,仍然可以查出来 “张三” 的没有 “部门编号” 的记录。所以说 “左连接” 与 “右连接” 的区别并不是很大。

    外连接练习①

    查询每个部门的名称和部门的人数?

    这道题看似简单,但是里面存在着两个难点,而且也存在容易出错的地方,详见下文 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;

    MySQL中数据表的外连接怎么使用

    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;

    MySQL中数据表的外连接怎么使用

    这个 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中数据表的外连接怎么使用

    本文内容来源于网友投稿,如有侵权请联系删除。
    作者最新文章
    编程开发 MySQL
    相关文章 更多
    链表删除节点的时间复杂度是多少及其详细分析
    链表删除节点的时间复杂度是多少及其详细分析

    详细分析链表删除节点的时间复杂度,深入探讨单链表与双向链表在不同已知前提下的查找与删除开销,并结合完整代码与清晰图解进行对比总结。

    codex如何配置模型参数及文件设置教程
    codex如何配置模型参数及文件设置教程

    想知道如何让AI写出的代码更贴合你的习惯?本文手把手教你在VS Code中调整Codex相关模型参数,通过修改配置文件优化温度值和令牌限制,解决代码建议不准确或响应慢的问题。

    Claude Code AI编程工具实力揭秘与编程助手实测
    Claude Code AI编程工具实力揭秘与编程助手实测

    通过实测展示Claude Code在终端中如何理解自然语言指令、自动修改代码文件并处理复杂编程任务,帮助开发者评估其实际辅助能力。

    winforms教程自学入门与基础开发步骤详解
    winforms教程自学入门与基础开发步骤详解

    本教程详细讲解如何使用Visual Studio创建WinForms项目,通过添加按钮和标签控件并编写点击事件代码,实现一个基础的计数器功能,适合C#初学者快速上手Windows窗体应用开发。

    Cursor自动补全设置教程教你快速开启代码补全功能
    Cursor自动补全设置教程教你快速开启代码补全功能

    详解Cursor编辑器中自动补全功能的开启与优化设置,涵盖Tab触发机制、上下文窗口调整及模型切换,帮助开发者解决补全延迟、干扰大等问题,提升编码流畅度。

    pandas的数据格式怎么转换和设置方法教程
    pandas的数据格式怎么转换和设置方法教程

    详解Pandas中数据格式转换的核心方法,包括astype强制转换、to_numeric容错处理及日期解析技巧,解决常见类型错误并提升数据处理效率。

    VS Code中文设置方法 简体语言包安装与切换教程
    VS Code中文设置方法 简体语言包安装与切换教程

    详细介绍在Visual Studio Code中安装Chinese (Simplified)语言包的方法,包括通过扩展市场搜索、安装及自动重启切换至简体中文界面的完整步骤,帮助开发者快速将编辑器本地化。

    cursor安装过程无法更改安装位置的解决方法
    cursor安装过程无法更改安装位置的解决方法

    针对Cursor安装包默认锁定C盘且无路径选择界面的问题,提供通过手动移动文件并创建目录联结(Symbolic Link)的解决方案,实现将软件安装在其他磁盘分区。

    rust下载安装教程详解及Windows环境配置方法
    rust下载安装教程详解及Windows环境配置方法

    详解Windows系统下Rust语言的安装步骤,重点解析rustup工具链管理机制,解决环境变量配置错误及MSVC链接器缺失问题,提供可复制的命令验证方法与常见报错的因果排查思路。

    vs code怎么配置 chat实用设置教程步骤
    vs code怎么配置 chat实用设置教程步骤

    详解VS Code中Chat插件的安装与核心配置步骤,重点解决API连接失败、响应慢等常见问题,通过优化上下文设置提升代码生成质量,适合希望集成AI辅助工具的开发者阅读。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    macOS软件
    macOS软件

    正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

    Mac软件 更多
    Blender
    Blender
    Windows、macOS 和 Linux

    Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。

    灵活计算器
    灵活计算器
    macOS/iOS/Android

    灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

    赤友清理大师
    赤友清理大师
    macOS

    赤友清理大师是一款为 Mac 设计的智能清理优化工具,可精准扫描垃圾、大文件、重复文件等,释放磁盘空间。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

    WINDOWS 更多
    Blender
    Blender
    Windows、macOS 和 Linux

    Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。

    Windows 10
    Windows 10
    Windows

    Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

    极度公式
    极度公式
    Windows/macOS/Linux

    极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。