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

为什么要使用外连接

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

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

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

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

外连接简介

外连接与内连接的%ignore_a_1%

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

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

外连接 例句 如下

SELECT e.empno, e.ename, d.dnameFROMt_emp eLEFT 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.dnameFROMt_dept dRIGHT 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.deptnoGROUP BY d.deptno;

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

OK,问题就在这里开始出现了。

大家注意这里的 “40” – “OPERATIONS” 部门,这个部门实际上是没有人的,也就是人数为 “0” ,但是奇怪的是,这里进行统计的时候,却出现了统计人数 “1” ,这是为什么呢?

这是因为我们在使用分组的时候,用的是 “左连接” ,保留了左表的所有的数据,所以就按照左表的 “deptno” 进行分组。(因为是保留了左表的记录,所以分组也需要按照左表进行分组。接下来的关键在于“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.deptnoGROUP 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)FROMt_dept d LEFT JOIN t_emp e ON d.deptno = e.deptnoGROUP BY d.deptno)UNION(SELECT d.deptno, d.dname, COUNT(*)FROMt_dept d RIGHT JOIN t_emp e ON d.deptno = e.deptnoGROUP BY d.deptno);-- 第一个查询语句,得到的结果集是各个部门的人数。-- 第二个查询语句,得到的结果集是隶属于各个部门的人数,但是因为 "张三" 是一个没有部门所属的 "临时工"-- 所以两个查询语句的结果集合并之下没救如下图所示。

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

以上就是MySQL中数据表的外连接怎么使用的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/144010.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
秘塔AI人工智能入口 秘塔AI在线版官网入口
上一篇 2025年12月1日 22:55:24
如何通过css工具Sass实现循环生成类
下一篇 2025年12月1日 22:55:27

相关推荐

  • hive安装配置实验

    一、安装前的准备工作 1. 配置并安装hadoop,请参考链接http://blog.csdn.net/wzy0623/article/details/50681554。 2. 下载以下安装包:mysql-5.7.10-linux-glibc2.5-x86_64.tar.gz、apache-hive…

    2026年9月24日
    600
  • 苹果15换屏幕费用是多少

    官方维修费用:品质与保障的代价 苹果官方售后以其高标准的服务和原装零部件著称。针对iPhone 15的屏幕更换,官方定价普遍处于1000元至2000元区间,具体费用会因机型差异(如标准版与Pro版)以及所在城市而有所不同。这一价格不仅体现了苹果品牌的技术投入与服务保障,也确保了维修后的设备性能与出厂…

    2026年9月24日
    200
  • 命令行下MySQL中文乱码如何设置utf8编码

    mysql命令行中文乱码解决方法是统一各环节字符集为utf8mb4。具体步骤如下:1.查看当前编码设置,确认character_set相关变量是否为utf8或utf8mb4;2.修改配置文件,在[client]和[mysqld]下设置默认字符集为utf8mb4并重启服务;3.修改已有数据库和表的字符…

    2026年9月24日
    100
  • Linux用户adduser与useradd命令区别

    adduser是交互式脚本,默认创建家目录并设密码,适用于Debian/Ubuntu;2. useradd是底层命令,需手动加参数创建家目录和Shell,通用性强,适合脚本使用。 在Linux系统中,adduser 和 useradd 都可以用来创建新用户,但它们在实现方式、使用习惯和功能上存在明显…

    2026年9月24日
    000
  • 如何在PHP的require语句中传递参数并有效管理变量作用域

    本文探讨了在php中使用`require`或`include`语句时如何向被引入文件传递参数。文章详细阐述了通过直接变量作用域共享、利用`$_get`超全局变量(不推荐)以及将引入文件内容封装为函数或类(推荐最佳实践)这三种方法,并提供了相应的代码示例,旨在帮助开发者理解和选择最适合其场景的参数传递…

    2026年9月24日
    000
  • 如何解决MySQL安装时配置不生效的处理方法?

    如何解决MySQL安装时配置不生效的处理方法?如何解决MySQL安装时配置不生效的处理方法?如何解决MySQL安装时配置不生效的处理方法?如何解决MySQL安装时配置不生效的处理方法?

    配置mysql时遇到配置不生效的问题,常见原因包括配置文件路径错误、语法问题、命令行参数覆盖及数据目录权限或初始化问题。1. 配置文件路径是否正确?mysql只会读取特定路径的配置文件,建议使用命令mysql –help | grep “default options&#82…

    2026年9月24日 用户投稿
    000
  • mysql如何优化表结构?表结构设计方法

    设计和优化 mysql 表结构应从字段类型选择、主键与索引设计、冗余与范式处理、分表分区策略四个方面入手。1. 合理选择字段类型,如整数用 int/bigint,枚举值用 enum 或 tinyint,日期用 datetime,避免过度使用 text/blob;2. 主键建议使用自增整型,避免长字段…

    2026年9月24日
    1000
  • PCIe 4.0和PCIe 5.0的固态硬盘,实际使用差别大吗?

    PCIe 5.0 SSD相比4.0在游戏加载中提升有限,仅快1-2秒且感知不强;但在视频剪辑、AI训练等生产力场景下,顺序读写速度提升近一倍,渲染和文件传输效率显著提高。 PCIe 4.0和5.0固态硬盘在实际使用中的差别,主要看你怎么用。对大多数普通用户来说,差距没想象中大;但如果你干的是专业活儿…

    2026年9月24日
    200
  • MySQL查询结果的排序和分页实现方法

    在mysql中,可以通过order by和limit关键字高效实现排序和分页。1.使用order by进行排序,支持升序和降序。2.使用limit和offset进行分页,控制返回结果的起始位置和数量。3.通过在排序列上创建索引,可以优化大数据集的查询性能。4.避免使用大offset值,改用主键或唯一…

    2026年9月24日
    100
  • Laravel Blade中条件隐藏元素的优雅实践

    本文探讨了在Laravel Blade模板中如何高效地实现HTML元素的条件隐藏。针对传统@if-@else语句导致代码冗余的问题,教程提出使用Blade的内联三元运算符在style属性中动态控制display: none,从而避免重复代码,提升模板的可读性和维护性。此外,还将介绍如何利用CSS类和…

    2026年9月24日
    100
  • mysql中如何排查磁盘空间不足问题

    先检查磁盘使用情况,使用df -h和du -sh定位大文件;再通过SQL查询分析数据库和表的空间占用;接着检查binlog、慢查询日志及临时文件;最后采取删除无用数据、归档、压缩、分区等措施释放空间并优化配置。 当MySQL出现磁盘空间不足时,可能会导致写入失败、服务中断甚至实例崩溃。排查这类问题需…

    2026年9月23日
    100
  • 如何在mysql中使用数值函数计算

    答案:MySQL数值函数用于执行数学运算,如ABS、ROUND、FLOOR、CEIL、MOD、POWER、SQRT等,可对数据直接计算。例如用ROUND四舍五入价格,TRUNCATE截断小数,FLOOR取整,MOD求余判断奇偶,SQRT开方,还可结合AVG、MAX等聚合函数使用,提升查询效率并减少应…

    2026年9月23日
    100
  • PHP同页面无限次表单提交与显示:防止数据覆盖的实现技巧

    本教程详细阐述了如何在php中实现同页面多次表单提交而不覆盖先前数据的方法。核心策略是利用html的数组命名输入(`name=”field[]”`)来收集多个值,并在每次页面刷新时,通过隐藏输入字段重新提交已有的数据,从而在不依赖数据库的情况下,实现“无限”次提交并显示所有历…

    2026年9月23日
    100
  • 如何在mysql中优化存储引擎参数

    优化MySQL存储引擎需根据业务场景调整参数。1. InnoDB:设innodb_buffer_pool_size为内存50%~70%,合理配置日志参数提升I/O性能,选用O_DIRECT减少缓存冲突,按磁盘性能设置io_capacity;2. MyISAM:分配足够key_buffer_size,…

    2026年9月23日
    100
  • 如何预防单点故障?VIP高可用搭建解决步骤

    如何预防单点故障?VIP高可用搭建解决步骤如何预防单点故障?VIP高可用搭建解决步骤如何预防单点故障?VIP高可用搭建解决步骤如何预防单点故障?VIP高可用搭建解决步骤

    单点故障是系统稳定性最大威胁,因为其一旦发生将导致服务瞬间瘫痪。解决核心在于消除“唯一”组件,通过构建高可用集群实现冗余备份。具体步骤包括:1. 使用虚拟ip(vip)配合keepalived工具实现自动漂移;2. 配置至少两台服务器组成集群并通过心跳机制监测状态;3. 设置track_script…

    2026年9月23日 用户投稿
    500
  • mysql中cno是什么意思 mysql列名常见缩写解析

    在mysql中,”cno”通常指的是”course number”(课程编号)。1. “cno”在教育系统中用于唯一标识课程,常作为主键。2. 其他常见缩写包括”sno”(学生编号)、”tno…

    2026年9月23日
    100
  • 一加R系列手机摄像头如何调整以拍出HDR视频?HDR视频的设置指南

    一加R系列手机摄像头如何调整以拍出HDR视频?HDR视频的设置指南一加R系列手机摄像头如何调整以拍出HDR视频?HDR视频的设置指南一加R系列手机摄像头如何调整以拍出HDR视频?HDR视频的设置指南一加R系列手机摄像头如何调整以拍出HDR视频?HDR视频的设置指南

    一加R系列拍摄HDR视频需开启相机中的HDR模式或选择4K等高分辨率视频模式,最佳光线为高对比度场景如日出日落,避免极暗或过亮环境,拍摄时启用防抖、使用三脚架以提升稳定性,并注意HDR视频具有更广动态范围和更高色深,但文件更大、对设备性能要求高,播放需支持HDR的设备以获得理想效果。 一加R系列手机…

    2026年9月23日 用户投稿
    300
  • 使用 Dompdf 一键生成大量 PDF 文件的优化方案

    本文旨在解决使用 Dompdf 生成大量 PDF 文件时遇到的超时问题。通过分析常见原因,提出了从Web服务器环境迁移到命令行环境,并配合 set_time_limit(0) 函数来避免执行超时,从而高效生成多个包含大量数据的 PDF 文件。 问题分析 从提供的代码片段可以看出,程序通过循环遍历 $…

    2026年9月23日
    600
  • mysql安装后怎么锁 mysql锁机制与使用方法详解

    mysql安装后怎么锁 mysql锁机制与使用方法详解mysql安装后怎么锁 mysql锁机制与使用方法详解mysql安装后怎么锁 mysql锁机制与使用方法详解mysql安装后怎么锁 mysql锁机制与使用方法详解

    mysql 的锁机制通过表级锁和行级锁管理并发访问,使用时需结合索引、事务控制以避免阻塞和死锁。1. 锁类型包括 myisam 的表级锁(读锁共享、写锁排他)和 innodb 的行级锁(记录锁、间隙锁、临键锁),后者并发性能更高;2. 手动加锁可通过 select … lock in s…

    2026年9月23日 用户投稿
    100
  • 从单片机到ARM Linux驱动——Linux驱动入门篇

    大家好,又见面了,我是你们的朋友全栈君。 嵌入式Linux操作系统具有:开放源码、所需容量小(最小的安装大约需要2MB)、不需著作权费用、成熟与稳定(经历这些年的发展与使用)、良好的支持等特点。因此被广泛应用于移动电话、个人数码等产品中。嵌入式Linux开发主要包括:底层驱动、操作系统内核、应用开发…

    2026年9月23日
    100

发表回复

登录后才能评论
关注微信