MySQL —— 复合查询

news2024/11/20 13:42:17

一、基本的查询回顾练习

前面两章节整理了许多关于查询用到的语句和关键字,以及MySQL的内置函数,我们先用一些简单的查询练习去回顾之前的知识

1. 前提准备

同样是前面用到的用于测试的表格和数据,一张学生表和三张关于雇员信息表

雇员信息表

2. 测试样例

2.1 查询工资高于500或岗位为MANAGER的雇员,同时还要满足他们的姓名首字母为大写的J

2.2 按照部门号升序而雇员的工资降序的排序

2.3 显示工资最高的员工名字和岗位

2.4 显示工资高于平均工资的人

同样是利用子查询,先算到平均工资是多少,然后条件筛选出高于该工资的人

2.5 显示每个部门的平均工资和最高工资

要不同部门的显示平均工资和最高工资,也就是要按部门先分组,再聚合

2.6 显示平均工资低于2000的部门号和它的平均工资

首先,我们要显示的是部门号和它的平均工资,要求是部门平均工资低于2000,因此还要得到各个部门的平均工资,并且进行条件筛选

2.7 显示每种岗位的雇员总数,平均工资

根据要求,应该要显示岗位、岗位雇员总数、平均工资,需要按岗位分组,聚合

二、多表查询

在实际开发中,往往要描述一些较为复杂的系统时,往往数据不止被记录在一张表格内,例如我们一直在使用的雇员信息表,就有三张,因此我们还需要多表进行查询

先介绍一个概念——笛卡尔积

笛卡尔积本质就是一种穷举的策略,在对两个表进行联合查询的时候,实际就是表一的第一条记录和表二的所有记录进行拼接,然后是表一第二条记录和表二的所有记录拼接,以此类推形成新表,这种穷举拼接的策略就是两个表的笛卡尔积

我们在需要用到多个表的数据时,联合查询会得到多个表的笛卡尔积,在其中通过条件筛选出我们需要的数据,就是多表查询,接下来还是利用雇员信息表来练习多表查询

1. 显示雇员名、雇员工资以及所在部门的名字

雇员名字和雇员工资在emp表中,而部门名字在dept表中,因此需要联合查询

2. 显示部门号为10的部门名,员工名和工资

首先我们需要显示部门名,员工名,还有工资,需要联合查询,然后是条件筛选出部门号为10的

3. 显示各个员工的姓名,工资,及工资级别

需要显示的是员工名字,工资和工资级别,因此要用到emp和salgrade这两个表

三、自查询

自查询实际就是一个表自己和自己的笛卡尔积,这种查询方式也有一定的应用场景,要注意,由于两个表都是同一张,因此命名上会有冲突,需要对表的名字进行重命名

应用场景

显示员工FORD的上级领导的编号和姓名

我们要找到员工FORD的领导信息,可以通过FORD信息中的领导编号去找到领导的信息,可以使用子查询的方式先找到FORD的领导编号,再找领导信息,同时也可以使用自查询的方式,去条件筛选出领导的信息

四、子查询

子查询在前面一些例子中已经用到过了,接下来详细整理和说明子查询

1.单行子查询

单行子查询就是前面用到的,子查询结果返回单行记录的情况

例子:显示SMITH同一部门的员工

首先我们要通过子查询先找到SMITH所属的部门,再进行条件筛选

2.多行子查询

当子查询返回结果为多行记录时,条件筛选的条件是一个集合,此时我们针对不同的情况,有三个关键字in、all、any去链接筛选条件:

in:表示筛选出该条件集合中的数据

all:表示前面的表达式需要满足和该集合中所有元素都作用且为true才符合筛选条件

any:表示前面的表达式和该集合中的元素任意一个满足条件即可符合筛选条件

例子:

a. 查询和10号部门的工作岗位相同的雇员名字、岗位、工资、部门号,但不包含10号本身

分析:要显示的是ename、job、sal、deptno,筛选条件是和部门号10相同的岗位,需要先找到和十号部门相同的岗位集合,条件是岗位是该集合其中一个即可符合条件,因此使用in,同时要去掉十号本身

b. 显示工资比部门30的所有员工的工资高的员工的名字、工资和部门号

分析:要显示的是员工名字、工资、部门号,条件是比部门30所有员工工资要高,我们可以选择找到该部门工资最高为多少,但这里为了示范all的使用,我们采用另一种思路,我们先找到30号部门所有员工工资的集合,然后筛选条件为大于该集合中的所有元素,因此用all

c. 显示工资比部门30的任意员工的工资高的员工的姓名、工资和部门号(结果包括部门30的人)

分析:显示ename、sal、deptno,要求比部门30的任意员工工资都高,先子查询找到该部门工资的集合,条件筛选是大于该部门的任意一人,因此使用any连接条件

3.多列子查询

子查询返回的结果为多列数据时就叫多列子查询

案例:查询和SMITH的部门和岗位完全相同的所有雇员,不含SMITH本人

分析:条件是和SMITH的部门和岗位都完全相同,因此需要先找到SMITH的岗位和部门是什么,该子查询返回结果是两列的,此时返回的结果的格式要认为是(v1,v2,...)这种类型,在做条件判断时,左侧也应该是这种格式

4.在from子句中使用子查询

我们可以将子查询的结果看作一张临时表,子查询的结果同样可以放在from后面去满足一些查询要求

案例:

a.显示每个高于自己部门平均工资的员工的姓名、部门、工资、平均工资

分析:先通过分组子查询可以查到各个部门的部门平均工资,然后可以对emp和子查询结果进行笛卡尔积,这样每个员工信息后面都附加上了其所在部门的平均工资,然后再条件筛选即可

select ename,emp.deptno,sal,avg_sal from emp,(select deptno,avg(sal) as avg_sal from emp group by deptno) as tmp where emp.deptno=tmp.deptno and emp.smp.sal>tmp.avg_sal;

b. 查找每个部门工资最高的人的姓名、工资、部门、最高工资

分析:先子查询到每个部门的最高工资,然后再和emp笛卡尔积得到新表进行筛选

select ename,sal,deptno,max_sal from emp,(select deptno dt,max(sal) max_sal from emp group by deptno) tmp where emp.deptno=tmp.dt and emp.sal=tmp.max_sal;

c. 显示每个部门的信息(部门名、编号、地址)和人员数量

分析:我们先将需要的信息都查询出来,我们需要每个部门的部门名、编号以及地址,这些信息都在dept表上,人员数量则是对emp表格中根据部门不同分组然后聚合

select dept.deptno,dept.dname,dept.loc,num from dept,(select deptno,count(*) as num from emp group by deptno) as tmp where dept.deptno=tmp.deptno;

5.合并查询

在实际应用中,为了合并多个select的查询结果,可以使用集合操作符 union 和 union all

(1)union

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

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

(2)union all(不去重)

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

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

总结

本篇更进一步的整理介绍了查询的操作,对一些复杂的情况进行各种复合查询的操作,以及提供了大量的练习和样例

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

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

相关文章

qt 布局学习笔记

目录 管理信息列表源码 c版: pro文件: qt 设置水平布局,里面有两个按钮,每个按钮就变的很宽,怎么设置按钮的精确位置 设置固定大小: 使用弹性空间(Spacer) 使用布局比例&…

Apache Doris 基础(一) -- Getting Started

Apache Doris 开源、实时数据仓库 Apache Doris是一个用于实时分析的现代数据仓库。 它提供大规模闪电般的实时数据分析。 实时获取和存储 在一秒钟内基于推的微批处理和基于拉的流数据获取。实时更新,追加和预聚合的存储引擎闪电般的查询 使用列式存储引擎、MPP架构…

vue3封装ElementUI plus Dialog弹窗

因为ElementuiPlus的dialog弹框的初始样式不太好看,而公司要求又要好看,本来是已经实现了,但是后来想想了发现封装完dialog的其他功能也要,所以特此记录一下 方案一 思路:封装一个组件,将所有新增的参数引入el-dialog 参数中,实现参数共用 新建一个组件,将官网暴露的属性全部引…

达梦数据库详解

达梦认证是指针对中国数据库管理系统(DBMS)厂商达梦公司所推出的数据库产品,即达梦数据库(DMDB),进行的一种官方认证体系。达梦认证旨在验证数据库管理人员对达梦数据库产品的掌握程度,及其在数…

【AD936X】 SDR 版图 欣赏

DIE : 4336x4730 um 的 65 nm 芯片 在顶部金属上,您可以看到 PLL 的电感器和日期代码 - 芯片在推出前两年就已准备就绪: 右下角是主数字块,应该是 128 抽头 FIR 滤波器。在最大放大倍率下,我们可以看到一排排标准单元。它们的放置…

[深度学习]基于yolov8+bytetrack+pyqt5实现车辆进出流量统计+车辆实时测速实现

以前使用过yolov5deepsort实现过车辆进出流量统计车辆实时测速,可以看我往期视频,这回改成yolov8bytetrack实现,实时性更好,原理和原来一样。车流量进出统计车速测量优点: 使用目标检测算法考虑bbox抖动,解…

绿联NAS DXP系列发布:内网穿透技术在私有云的应用分析

5月23日,绿联科技举行了“新一代存储方式未来已来”发布会,发布了绿联NAS私有云DXP系列(包括两盘位到八盘位的九款新品)以及由绿联科技自研的全新NAS系统UGOS Pro。此次绿联发布的DXP系列九款产品,共有两盘位、四盘位、…

Windows DNS 服务器配置转发器

DNS服务器转发器 在企业中由于自身条件的限制, 可能本身的DNS新能并不是很好,这个时候通过使用转发器功能, 将收到的DNS请求转发给另外一台高性能的DNS服务器,让其做后面的迭代查询。 1. 选择DNS服务器, 右击选择属性…

【LeetCode:496. 下一个更大元素 I + 单调栈】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

windows2008修改远程桌面端口,如何果断修改远程桌面端口,确保系统安全无忧!

在数字化时代的浪潮中,Windows 2008系统以其卓越的稳定性和可靠性,赢得了众多企业和个人的青睐。然而,随着网络安全问题的日益严峻,如何确保远程桌面连接的安全,成为了摆在我们面前的一道难题。今天,我将为…

MySQL的ODBC驱动下载、安装以及配置数据源

下载地址:odbc官方下载地址 MySQL :: Download Connector/ODBC 下载安装ODBC驱动 配置MySQL ODBC 数据源 进入控制面板->系统和安全->Windows工具 Data Source Name填写需要生成的ODBC数据源的名称。Description选填。如果使用远程数据库服务器&a…

我怎么使用AI大语言模型学英语

今天已经是我开始英语拉练任务的第39天了,一直在笃定的、雷打不动的、机械笨拙的重复做一件事,那就是使用AI工具,将我想要说的话翻译成英文,生成语音文件,每天朗读三小时,最终整个背下来。我也在思考&#…

使用分水岭算法进行图像分割

文章目录 理论代码 原文路径:opencv-4.6.0\doc\py_tutorials\py_imgproc\py_watershed 目标 在这一章当中, 我们将学习使用分水岭算法使用基于标记的图像分割我们将看到:cv.watershed() 理论 任何灰度图像都可以被视为地形表面,其中高强度…

【面经】单片机

1、单片机IO口工作方式 输入 模拟输入(GPIO_Mode_AIN):关闭施密特触发器,将电压信号传送到片上外设模块,通常用于连接模拟信号源。浮空输入(GPIO_Mode_IN_FLOATING):在浮空输入状态…

element ui 的密码输入框点击显示隐藏密码时,图标随之改变

场景图&#xff1a; 原理&#xff1a; 通过修改el-input框的type属性&#xff0c;来设置显示或者隐藏。从而改变图标地址。 <el-input class"passwordinput" :type"pwdObj.pwdType" ref"pwdInput" placeholder"密码"v-model"…

VScode C/C++环境安装配置

1. 编译器需要从如下网站下载&#xff1a; MinGW-w64 - for 32 and 64 bit Windows - Browse Files at SourceForge.net 2. 切换到file选项&#xff0c;下拉找到对应的文件版本直接下载&#xff1a; 3. 右键解压到当前文件夹如下&#xff1a; 4. 如图所示复制浏览器上的相应的…

Java 8 Lambda 表达式

目录 出现的背景 外部类 代码 运行 内部类 代码 运行 匿名内部类 代码 运行 Lambda 表达式简介 Lambda 表达式的结构 lambda表达式 代码 运行 什么是功能接口&#xff08;Functional interface&#xff09; 代码 接口 实现类 使用方法重写 使用lambda表达…

解决 fatal: Not a git repository (or any of the parent directories): .git 问题

解决方法&#xff1a;在命令行 输入 git init 然后回车就好了

Aware接口作用

介绍 Aware&#xff08;感知&#xff09;接口是一个标记&#xff0c;里面没有任何方法,实际方法定义都是子接口确定&#xff08;相当于定义了一套规则&#xff0c;并建议子接口中应该只有一个无返回值的方法&#xff09;。 我们知道spring已经定义好了很多对象&#xff0c;如…

深入解析R语言的贝叶斯网络模型:构建、优化与预测;INLA下的贝叶斯回归;现代贝叶斯统计学方法;R语言混合效应(多水平/层次/嵌套)

目录 ①基于R语言的贝叶斯网络模型的实践应用 ②R语言贝叶斯方法在生态环境领域中的应用 ③基于R语言贝叶斯进阶:INLA下的贝叶斯回归、生存分析、随机游走、广义可加模型、极端数据的贝叶斯分析 ④基于R语言的现代贝叶斯统计学方法&#xff08;贝叶斯参数估计、贝叶斯回归、…