MySQL 复合查询和内外连接 -- 子查询,多表查询,自连接,合并查询,表的内外连接

目录

1. 子查询

1.1 单行子查询

1.2 多行子查询

1.3 多列子查询

1.4 在 from 子句中使用子查询

2. 多表查询

3. 自连接 

4. 合并查询

4.1 union

4.2 union all

5. 表的内连接

6. 表的外连接


        下列先给出该博客中所用到的所有表的数据。

        (1)部门表(dept)

        (2) 员工表(emp)

        (3) 薪资等级表(salgrade)

1. 子查询

        子查询是指嵌入在其他 sql 语句中的 select 语句,也叫嵌套查询。

1.1 单行子查询

        单行子查询:指的是在子查询语句中,返回的数据只有一行。-- 返回一个字段并且该字段只有一个值。

        例1:查询与 SMITH 同一个部门的员工

        如上图,MySQL 会先执行括号中的子语句,返回一个 ename = 'SMITH' 的部门号 deptno,然后再执行外部 select 语句,筛选部门号与 SMITH 相同的数据。 

1.2 多行子查询

        多行子查询:指的是在子查询语句中,返回的数据为多行。-- 返回一个字段并且该字段有多个值。

        (1)in 关键字:用于判断一个数据是否在某一个集合当中

        例1:查询和 10 号部门的工作岗位相同的员工名字,岗位,工资,部门号但是不包含 10 号部门自己的员工

        上述的查询可以这样理解,(1)查出 10 号部门有哪些岗位。(2)筛选出 emp 表中与 10 部门中岗位相同岗位的员工。(3)排除 10 号部门自己的员工。 

        上述的语句中,子查询到的 job 不只是一个值,所以被称为多行子查询。

        (2)all 关键字:用于在判断的时候所有数据都要满足条件。

        例2:查询工资比 30 号部门所有员工的工资高的员工的姓名、工资和部门号。

        上图中的做法是先找到 30 号部门中最高的工资,然后再筛选出大于最高工资的员工。

        而上述的做法是先筛选出 30 号部门中所有员工的工资,然后再次筛选大于 30 号部门中所有员工工资的其他员工。 

        (3)any 关键字:用于在判断时是否至少有一条数据满足条件。

        例3:显示工资比 30 号部门中至少一名员工工资高的员工的姓名、工资、和部门号(包含自己部门的员工)。

        换句话说,就是显示比 30 号部门中最低工资要高的员工。

        上图为先筛选出 30 号部门中最低工资,然后筛选大于最低工资的员工。

        而这个图是先筛选出 30 号部门所有员工的工资,然后判断的时候表示 sal 大于 30 号部门中任意一名员工的工资高即可。 

1.3 多列子查询

        多列子查询:子查询中返回的数据为多列。-- 返回多个字段,该字段可以有一个值也可以有多个值。其实上述例子中的情况为单列单行自查徐,单列多行子查询,所以多行和多列是不冲突的。

        例1:查询和 SMITH 的部门和岗位完全相同的其他员工

        上述的子查询可以称为多列单行子查询,先查出 SMITH 的部门号和岗位,在利用部门号和岗位筛选出员工,最后在筛选掉 SMITH 自己。 

1.4 在 from 子句中使用子查询

        上述所有的子查询都是在 where 子句中充当筛选条件。但是子查询也可以在 from 子句中使用,这里要清楚一个概念,任何时刻查询出来的临时数据,在逻辑上本质都可以当作一张表

        例1:显示每个部门中高于该部门平均工资的员工的姓名、部门、工资以及部门平均工资

        上图中先是将每个部门的部门号和部门平均工资筛选出来作为一张临时表,再将两张表作笛卡尔积,筛选出两张表中部门号相同且工资大于部门平均工资的员工信息。 

2. 多表查询

        如下图所示,得到的结果称为笛卡尔积,也就是两张表每条数据的两两组合

        其中有些数据是没有意义的,比如第一条数据,SMITH 是属于 20 号部门的,所有拼接上部门表中部门号为 10 的数据就不是一条合理的数据,可以利用两张表相同的字段(上图中的部门号)进行有意义的数据筛选

        例1:显示员工名、员工工资以及所在部门(不仅仅是部门号,还有部门信息)。则需要从 emp 表和 dept 表中得出数据,所以可以用以下查询语句进行查询:

        例2:显示各个员工的姓名、工资及工资级别。则需要从 emp 表和 salgrade 表中得到数据,可以通过员工工资在那个工资等级的范围内进行有效数据的筛选:

3. 自连接 

        自连接就是将两张相同的表作笛卡尔积。由于两张表的名字相同,所以作笛卡尔积的时候需要进行重命名

        如上两张图所示,当没有重命名对相同的表作笛卡尔积会报错,重命名之后作笛卡尔积就不会报错。 

        例1:显示员工 FORD 上级领导的编号和姓名(mgr 是员工领导的编号)。这个需求可以分为两步来进行,一是找打 FORD 上级领导的编号,二是使用这个编号找到领导的信息,而这些信息都在 emp 表中,所以语句如下:

        也可以将 emp 表先进行自连接,然后通过 FORD 上级领导编号 mgr 和员工编号 empno 相等的方式找到 FORD 上级领导的信息,语句如下:

4. 合并查询

4.1 union

        union:该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中重复的行

        例1:将工资大于 2500 或职位是 MANAGER 的人找出来

        上述是使用了两个筛选条件筛选出结果。 

        而上图是使用 union 将两个查询的结果集合并起来。 

4.2 union all

        union all:该操作符用于取得两个结果集的并集。但是该操作符不对结果集中重复行去重

        上述两种合并查询的时候列字段的个数和属性必须相同才能进行拼接。 

5. 表的内连接

        上述多表进行笛卡尔积之后都需要一个 where 语句进行有效数据的筛选,其实就叫做内连接,但是为了方便给其规定了一种内连接语法

select 字段 from 表1 inner join 表2 on 连接条件 and 其他条件;

        例1:显示 SMITH 的名字和部门名称

        上图为之前使用 where 子句的写法。

        这个是使用内连接语法的写法。 

6. 表的外连接

        (1)左外连接:在两张表进行笛卡尔积之后,左表的数据完全显示

select 字段 from 表名1 left join 表名2  on 连接条件;

        如上图所示,现在有两张表,一个学生表,一个成绩表,需要将学生表中的所有行数据筛选出来,就算学生没有成绩也需要筛选出来,这时候就可以使用左外连接

        (2)右外连接: 在两张表进行笛卡尔积之后,右表的数据完全显示

select 字段 from 表名1 right join 表名2  on 连接条件;

        现在需要将成绩表中所有行数据筛选出来,就算成绩没有对应的学生也要将右表的所有行进行显示。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/89333.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/89333.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【STM32+LAN9252+HAL库】EtherCAT从站搭建 保姆级教程

目录 一、生成协议栈及XML文件 二、使用stm32CuboMX配置外设 三、协议栈移植 鉴于本人对EtherCAT的掌握程度十分有限,这篇文章仅作为我搭建基础从站的过程记录不做更多讲解。本文内容主要为SPI模式的基础搭建,更多深入的学习资料和细节,大家…

【LeetCode 热题 100】239. 滑动窗口最大值——(解法二)滑动窗口+单调队列

Problem: 239. 滑动窗口最大值 题目:给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值 。 【LeetCode 热题 100】239. 滑…

MySQL 8.0 连接 5.x 服务器认证问题

总的来说,答案是:可以,但是需要特别注意认证方式的兼容性问题。 MySQL 8.0 引入了新的默认认证插件 caching_sha2_password,而 MySQL 5.x(及更早版本)使用的是 mysql_native_password。当你用一个 8.0 的客…

Spring原理揭秘(一)

什么是spring? spring框架是一个轻量级的开源的JavaEE框架。 所谓轻量级则是:占用空间小,代码侵入性低,代码耦合度低,降低代码复杂度,可以轻易适配多种框架。 随着spring的不断发展,它所占用…

Visual Studio Code自用搜索技巧整理

多文件跨行搜索 用途 在多个日志文件中搜索跨行日志 方法 1.用VS Code打开待搜索文件所在的目录; 2.按快捷键(CtrlShiftF)打开全局搜索; 3.点击搜索框右侧的开启正则表达式; 4.输入正则表达式,例如&…

Axure PR 9 验证码登录 案例

大家好,我是大明同学。 这期内容,我们来用Axure来制作一个短信验证登录页面的小案例。 验证码登录小案例 创建手机号输入框所需的元件 1.打开一个新的 RP 文件并在画布上打开 Page 1。 2.在元件库中拖出一个矩形元件,选中矩形元件&#xf…

监听器模式

1. 问题背景 假设我们有一个 银行账户管理系统,该系统需要监控用户账户余额的变动,并在发生变动时,自动执行一些相关的操作,比如发送 余额变动通知(如短信、邮件等)。为了实现这一功能,我们希望…

帕鲁杯应急响应赛题:知攻善防实验室

一、背景信息 在这个跳跃的数字舞台上,数据安全成了政企单位稳航的重要压舱石。某政企单位,作为一艘驶向未来 的巨轮,对数据的把控丝毫不敢松懈。眼下,我们即将启航一场无与伦比的探险——“信息安全探索之 旅”。 这趟旅程的目的…

【硬核数学】2.2 深度学习的“微积分引擎”:自动微分与反向传播《从零构建机器学习、深度学习到LLM的数学认知》

欢迎来到本系列的第七篇文章。在上一章,我们用张量武装了我们的线性代数知识,学会了如何描述和操作神经网络中的高维数据流。我们知道,一个神经网络的“前向传播”过程,就是输入张量经过一系列复杂的张量运算(矩阵乘法…

DAY 45 Tensorboard使用介绍

浙大疏锦行https://blog.csdn.net/weixin_45655710知识点回顾: tensorboard的发展历史和原理tensorboard的常见操作tensorboard在cifar上的实战:MLP和CNN模型 作业:对resnet18在cifar10上采用微调策略下,用tensorboard监控训练过程…

2023年全国硕士研究生招生考试英语(一)试题总结

文章目录 题型与分值分布完形填空错误 1:考察连词 or 前后内容之间的逻辑关系错误2:错误3:错误4:这个错得最有价值,因为压根没读懂错误5:学到的短语: 仔细阅读排序/新题型翻译小作文大作文 题型…

react-数据Mock实现——json-server

什么是mock? 在前后端分离的开发模式下,前端可以在没有实际后端接口的支持下先进行接口数据的模拟,进行正常的业务功能开发 json-server实现数据Mock json-server是一个node的包,可以在不到30秒内获得零编码的完整Mock服务 实现…

使用POI导入解析excel文件

首先校验 /*** 校验导入文件* param file 上传的文件* return 校验结果,成功返回包含成功状态的AjaxResult,失败返回包含错误信息的AjaxResult*/private AjaxResult validateImportFile(MultipartFile file) {if (file.isEmpty()) {return AjaxResult.er…

从0开始学习计算机视觉--Day06--反向传播算法

尽管解析梯度可以让我们省去巨大的计算量,但如果函数比较复杂,对这个损失函数进行微分计算会变得很困难。我们通常会用反向传播技术来递归地调用链式法则来计算向量每一个方向上的梯度。具体来说,我们将整个计算过程的输入与输入具体化&#…

企业流程知识:《学习观察:通过价值流图创造价值、消除浪费》读书笔记

《学习观察:通过价值流图创造价值、消除浪费》读书笔记 作者:迈克鲁斯(Mike Rother),约翰舒克(John Shook) 出版时间:1999年 历史地位:精益生产可视化工具的黄金标准&am…

Day02_C语言IO进程线程

01.思维导图 02.将当前的时间写入到time. txt的文件中,如果ctrlc退出之后,在再次执行支持断点续写 1.2022-04-26 19:10:20 2.2022-04-26 19:10:21 3.2022-04-26 19:10:22 //按下ctrlc停止,再次执行程序 4.2022-04-26 20:00:00 5.2022-04-26 2…

FFmpeg中TS与MP4格式的extradata差异详解

在视频处理中,extradata是存储解码器初始化参数的核心元数据,直接影响视频能否正确解码。本文深入解析TS和MP4格式中extradata的结构差异、存储逻辑及FFmpeg处理方案。 📌 一、extradata的核心作用 extradata是解码必需的参数集合&#xff0…

【CV数据集介绍-40】Cityscapes 数据集:助力自动驾驶的语义分割神器

🧑 博主简介:曾任某智慧城市类企业算法总监,目前在美国市场的物流公司从事高级算法工程师一职,深耕人工智能领域,精通python数据挖掘、可视化、机器学习等,发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…

SAP月结问题9-FAGLL03H与损益表中研发费用金额不一致(FAGLL03H Bug)

SAP月结问题9-FAGLL03H与损益表中研发费用金额不一致(S4 1709) 财务反馈,月结后核对数据时发现FAGLL03H导出的研发费用与损益表中的研发费用不一致,如下图所示: 对比FAGLL03H与损益表对应的明细,发现FAGLL03H与损益表数据存在倍数…

HTML inputmode 属性详解

inputmode 是一个 HTML 属性&#xff0c;用于指定用户在编辑元素或其内容时应使用的虚拟键盘布局类型。它主要影响移动设备和平板电脑的输入体验。 语法 <input inputmode"value"> <!-- 或 --> <textarea inputmode"value"></texta…