我的编程空间,编程开发者的网络收藏夹
学习永远不晚

一文详解MySQL中数据表的外连接

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

一文详解MySQL中数据表的外连接

该章节的内容为多表连接查询的外连接,因为 MySQL 是关系型数据库,数据是拆分重组在多个数据表里面的。所以我们势必要从多个数据表中提取数据,通过 SQL 语句的内连接与外连接就能够实现多表查询了。这部分内容是需要我们重点学习的,学习的过程中会穿插多种的案例来强化对表连接的语法的运用。

为什么要使用外连接

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

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

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

外连接简介

外连接与内连接的区别:

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

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

外连接 例句 如下

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中数据表的外连接的文章就介绍到这了,更多相关MySQL外连接内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

一文详解MySQL中数据表的外连接

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

一文详解MySQL中数据表的外连接

因为MySQL是关系型数据库,数据是拆分重组在多个数据表里面的。所以我们势必要从多个数据表中提取数据,通过SQL语句的内连接与外连接就能够实现多表查询了,本文就来讲讲MySQL的外连接
2022-11-13

详解MySQL的内连接和外连接

mysql 中的内连接、左外连接和右外连接是用于连接两个或多个表的不同方式,它们之间的区别如下:内连接(Inner Join):内连接也称为等值连接,只返回两个表中键值匹配的行,即只有在两个表中都有匹配的数据时才会返回。内连接的语法如下
2023-05-06

MySQL总结(十)表连接查询(内、外连接)-详解

表连接查询1.什么是多表查询准备数据# 创建部门表create table dept( id int primary key auto_increment, name varchar(20))insert into dept (name) values (
MySQL总结(十)表连接查询(内、外连接)-详解
2020-11-18

MySQL数据库复合查询与内外连接图文详解

目录一、多表查询二、自连接三、子查询四、合并查询五、表的内连接和外连接1、内连接2、外连接总结 前面我们讲解的mysql表的查询都是对一张表进行查询,即数据的查询都是在某一时刻对一个表进行操作的。而在实际开发中,我们往往还需要对多个表同时进
MySQL数据库复合查询与内外连接图文详解
2024-10-04

MySQL中的连接操作:内连接、外连接和交叉连接详解

MySQL中的连接操作:内连接、外连接和交叉连接详解在MySQL数据库中,连接操作是一种常用的操作技术,用于将两个或多个表中的数据按照一定的条件进行合并。连接操作可以帮助我们处理复杂的数据查询和分析需求。在MySQL中,我们通常使用内连接、
2023-10-22

Mysql内连接与外连接的区别详解

目录前言内连接inner join外连接outer join左(外)连接 left join右(外)连接 right join总结前言我在写sql查询的时候,用的最多的就是where条件查询,这种查询也叫内连查询inner join,当然
2023-01-28

pycharm中连接mysql数据库的步骤详解

前言 最近在新的环境配置pycharm的项目时候,发现pycharm不能连接到mysql数据库。由于安了java环境但是还没配置相关的库,并且jetbrains家的IDE一般都是java写的,于是猜想可能是java缺少mysql的驱动。所以
2022-06-04

IDEA连接Mysql数据库的详细图文教程

项目开发时使用IntellijIDEA连接本地数据库,将数据库可视化,还可对数据库表直接进行增删改查操作,方便快捷又清晰,下面这篇文章主要给大家介绍了关于IDEA连接Mysql数据库的详细图文教程,需要的朋友可以参考下
2023-03-06

连接到一个MySQL数据库时,如何查看其他MySQL数据库的表列表?

借助SHOW TABLES From Database_name查询,我们可以看到另一个数据库的表。这里Database_name是我们当前没有使用的数据库的名称。考虑以下示例,其中我们运行查询以获取数据库名称“tutorial”中的表列表
2023-10-22

MySQL数据库中的外键约束详解

外键是关系数据库中一种重要的数据完整性约束,它用于建立表与表之间的关联关系。外键约束指定了一个表的列或一组列必须存在于另一个表的主键或唯一键中。在MySQL中,外键约束使用FOREIGN KEY关键字来定义。以下是外键约束的详细解释:1.
2023-09-22

阿里云MySQL数据库的连接方法详解

在阿里云上使用MySQL数据库时,我们需要了解如何连接数据库。本文将详细介绍阿里云MySQL数据库的连接方法。一、准备工作首先,我们需要了解一些基本的概念。MySQL是一种关系型数据库管理系统,它可以存储和管理大量的结构化数据。阿里云提供了MySQL数据库服务,我们可以使用它来存储和管理数据。二、连接MySQL数
阿里云MySQL数据库的连接方法详解
2023-11-18

MySQL数据库表中的约束详解

目录mysql表中的约束(constraint)约束分类非空约束唯一性约束复合约束主键约束自增列-AUTO_INCREMENTlzqXVuAOKT外键约束FOREIGN KEY约束CHECK约束DEFAULT约束MySQL表中的约束(con
2023-03-02

编程热搜

目录