MySQL -- 复合查询

数据库的查询是数据库使用中比较重要的环节,前面的基础查询比较简单,不做介绍,可自行查阅。本文主要介绍复合查询,并结合用例进行讲解。

本文的用例依据Soctt模式的经典测试表,可以自行下载,也可以自己创建
链接:点这里跳转
自行创建步骤如下:

0、预备工作

0.1 建表

-- 创建 dept 表(部门表)
CREATE TABLE dept (deptno INT PRIMARY KEY,  -- 部门编号dname VARCHAR(14),       -- 部门名称loc VARCHAR(13)          -- 部门位置
);-- 创建 emp 表(员工表)
CREATE TABLE emp (empno INT PRIMARY KEY,   -- 员工编号ename VARCHAR(10),       -- 员工姓名job VARCHAR(9),          -- 职位mgr INT,                 -- 上级经理编号hiredate DATE,           -- 入职日期sal DECIMAL(7,2),        -- 工资comm DECIMAL(7,2),       -- 奖金deptno INT,              -- 部门编号FOREIGN KEY (deptno) REFERENCES dept(deptno)
);-- 创建 salgrade 表(工资等级表)
CREATE TABLE salgrade (grade INT PRIMARY KEY,   -- 工资等级losal DECIMAL(7,2),      -- 最低工资hisal DECIMAL(7,2)       -- 最高工资
);

0.2 插入测试数据

-- 插入 dept 表数据
INSERT INTO dept (deptno, dname, loc) VALUES
(10, 'ACCOUNTING', 'NEW YORK'),
(20, 'RESEARCH', 'DALLAS'),
(30, 'SALES', 'CHICAGO'),
(40, 'OPERATIONS', 'BOSTON');-- 插入 emp 表数据
INSERT INTO emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) VALUES
(7369, 'SMITH', 'CLERK', 7902, '1980-12-17', 800.00, NULL, 20),
(7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 1600.00, 300.00, 30),
(7521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1250.00, 500.00, 30),
(7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 2975.00, NULL, 20),
(7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250.00, 1400.00, 30),
(7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01', 2850.00, NULL, 30),
(7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2450.00, NULL, 10),
(7788, 'SCOTT', 'ANALYST', 7566, '1982-12-09', 3000.00, NULL, 20),
(7839, 'KING', 'PRESIDENT', NULL, '1981-11-17', 5000.00, NULL, 10),
(7844, 'TURNER', 'SALESMAN', 7698, '1981-09-08', 1500.00, 0.00, 30),
(7876, 'ADAMS', 'CLERK', 7788, '1983-01-12', 1100.00, NULL, 20),
(7900, 'JAMES', 'CLERK', 7698, '1981-12-03', 950.00, NULL, 30),
(7902, 'FORD', 'ANALYST', 7566, '1981-12-03', 3000.00, NULL, 20),
(7934, 'MILLER', 'CLERK', 7782, '1982-01-23', 1300.00, NULL, 10);-- 插入 salgrade 表数据
INSERT INTO salgrade (grade, losal, hisal) VALUES
(1, 700, 1200),
(2, 1201, 1400),
(3, 1401, 2000),
(4, 2001, 3000),
(5, 3001, 9999);

创建好以后,如果表的内容和下图一样,那基本就没问题了

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1、复合表的查询

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

根据上述的要求,我们可以发现,要查询的表总共两个条件,工资高于500 或 岗位为MANAGER, 首字母为J。 根据上述的两个条件,我们可以写出对应的sql查询语句: select name, job , sal from emp where (sal >= 500 or job = 'MANAGER') and enum like 'J%'; 这两个条件可以看成是并列条条件

在这里插入图片描述

2.按照部门号升序而雇员工资降序的顺序对表的内容排序

先观察一下这里的需求,首先就是要部门号升序,然后就是雇员的工资降序,所以这个案例的需求非常简单。根据这个要求我们可以写出sql查询语句:select deptno , sal from emp order by deptno asc , sal desc;

在这里插入图片描述

3. 使用年薪进行降序排序
这里我们需要特别注意的一个点就是年薪这个概念,年薪在这里是包括了12个月的月薪加上奖金,而这里奖金就是comm,但是奖金这一列很多都是NULL,而NULL是不参与计算的,所以这里就需要用ifnull(expression ,values)(如果expression为null,返回的值为values否则返回expression)利用这个函数的特点,我们就可以算出年薪 = 12 x sal + ifnull(comm,0); 根据这个要求我们可以写出sql查询语句:select sal * 12 + ifnull(comm,0) 年薪 from emp order by 年薪 desc;

在这里插入图片描述

4.显示工资最高的员工名字和工作岗位
这条语句的要求非常简单,我们可以直接写出对应sql查询语句: select ename , job from emp where sal = (select max(sal) from emp);这里select是可以嵌套使用的,执行顺序就和C语言的中函数一样。当然,这里我们也可以分两步走,先把最高工资打印出来,再让第二条语句中 sal = 最高工资,结果是一样的。

在这里插入图片描述

5. 显示工资高与平均工资的员工信息
这个例子的要求和上面一个例子相差无几,做法也都差不多,先求出平均工资,再作比较即可。我们可以直接写出对应sql查询语句:select * from emp where sal >= (select avg(sal) from emp);

在这里插入图片描述

6.显示每个部门的平均工资与最高工资
这里也是只有两个条件,我们将平均工资和最高工资列出即可。我们可以直接写出对应sql查询语句:select deptno ,avg(sal),max(sal) from emp group by deptno;这里是先分组,然后再对内中内容进行筛查。

在这里插入图片描述

7.显示平均工资低于两千的部门号和它的平均工资
这个例子就需要和上面的例子一样,先对部门进行分组,分完组后就可以计算平均工资,然后再比对工资低于两千的部门。根据上述的条件,我们可以直接写出对应sql查询语句:select deptno ,avg(sal) 平均工资 from emp group by deptno having 平均工资 < 2000;这里的having是最后执行的,所以可以使用平均工资这个别名。

在这里插入图片描述

8.显示每种岗位的雇员总数,平均工资
这个例子和上面几个例子大差不差,这里不再赘述,直接把对应的语句写出:select deptno ,count(job) 人数,avg(sal) 平均工资 from emp group by job;

在这里插入图片描述

2、多表复合查询

前面我们介绍了单张表下的复合查询,但在日常生活中还存在非常的多表查询的情况。

1、显示每一个雇员名,雇员工资和部门名称
这个例子中和上面不同就是我们需要去查询部门名称,部门名称是在dept这张表中,而雇员名称以及工资在emp这张表中。这就需要我们将两张表的内容合并成一张表,也就是对第一张表的每一行内容与第二张表整张表进行组合,这种穷举的方式也叫作笛卡尔积。当然这种方式会生成很多没有啥意义的组合(部门号不对应)。这里我们就可以使用where进行筛查,select * from emp, dept where emp.deptno = dept.deptno结果如下图
>![
经过上述sql语句的筛查基本已经把要求给完成了,我们这里稍微完善一下即可:select ename,sal,dname from emp, dept where emp.deptno = dept.deptno
在这里插入图片描述

3、自链接

前面我们了解了不同表之间的进行链接查询,下面介绍一下同一张表之间链接。以下面这个例子为例:a.显示员工FORD的上级领导的编号和姓名(mgr是员工领导的编号–empno)。这个例子中,我们需要将在FORD的领导编号查出,然后在从当前这张表中查领导的相关信息。由此我们可以写出对应的sql语句:select empno,ename from emp where emp.empno=(select mgr from emp where ename=‘FORD’);

在这里插入图片描述

4、子查询

概念:子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询。前面已有描述,这里就不再赘述

4.1、单行子查询

单行子查询表示的就是返回结果只有一行的子查询,以下面这一个通过下面这个例子帮助了解:
显示SMITH同一部门的员工
这个案例比较简单,我们只需先对SMITH先做子查询即可:select * from emp where deptno = (select deptno from emp where ename=‘smith’);

在这里插入图片描述

4.3、多行子查询

这种子查询返回结果有很多行,但是原本子查询返回结果只有一行,所以这里我们需要将引入一些关键字,才能使其达到多行子查询的效果。

  • in关键字
  • all关键字
  • any关键字

首先我们可以通过一个例子了解一下in关键字:a.查询和10号部门的工作岗位相同的雇员的名字,岗位,工资,部门号,但是不包含10自己.
在这个例子中,我们要先查询10号部门的工作岗位相同的雇员,然后才是其它的相关信息,最后剔除十号部门。
第一步:select distinct job from emp where deptno=10;
第二步:select ename,job,sal,deptno from emp where job in (select distinct job from emp where deptno=10);这里的in在where中作为一种条件判断,表示判断job否在子查询中的表中。
第三步:select ename,job,sal,deptno from emp where job in (select distinct job from emp where deptno=10) and deptno<>10;
在这里插入图片描述

然后,我们通过另外一个例子来增加对all的理解:显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号.这里的all关键字其实和上面的in关键字一样,也是where中作为一种条件判断,代表子查询的所有结果。我们可以直接写出对应的sql语句:select ename, sal, deptno from emp where sal > all(select sal from emp where deptno=30);

在这里插入图片描述

最后一个any,作用和上面两个关键字大同小异,表示子查询的任意一个结果,用一个例子帮助理解:显示工资比部门30的任意员工的工资高的员工的姓名、工资和部门号(包含自己部门的员工).,对应的sql语句:select ename, sal, deptno from emp where sal > any(select sal from emp where deptno=30);

在这里插入图片描述

4.4、多列子查询

单行子查询是指子查询只返回单列,单行数据;多行子查询是指返回单列多行数据,都是针对单列而言的,而多列子查询则是指查询返回多个列数据的子查询语句。以下面例子为例:查询和SMITH的部门和岗位完全相同的所有雇员,不含SMITH本人这里第一步就是筛出SMITH部门和岗位相同的雇员,然后剔除SMITH,我们可以用括号的方式来对子查询各列的数据进行查询比对,具体方式如下: select ename from emp where (deptno, job)=(select deptno, job from emp where ename=‘SMITH’) and ename <> ‘SMITH’;

4.5、from字句中使用子查询

通过对前面的相关知识的了解,我们可以知道,子查询本质其实就是一张新的临时表,所以本质上我们查表都是在查一张表,就是将临时表和原表进行处理后的一张新表。既然上面 where 后面能够使用子查询,那from后面也必然是可以使用子查询的。from后面使用子查询就是将子查询生成的临时表与另外的表做笛卡尔积生成新的表,在从新的表中对数据进行筛查。下面用一个例子来帮助理解:显示每个高于自己部门平均工资的员工的姓名、部门、工资、平均工资
对应的sql语句://获取各个部门的平均工资,将其看作临时表
select ename, deptno, sal, format(asal,2) from emp, (select avg(sal) asal, deptno dt from emp group by deptno) tmp where emp.sal > tmp.asal and emp.deptno=tmp.dt;需要
需要注意的时from中子查询形成的临时表要有临时的名称。

5、合并查询

由于这个合并查询并不多见,使用率也较低,所以这里简单介绍即可。

union操作符:该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中的重复行。例子:将工资大于2500或职位是MANAGER的人找出来。 sql语句:select ename, sal, job from emp where sal>2500 union select ename, sal, job fromemp where job='MANAGER';

union all操作符:该操作符用于取得两个结果集的并集。当使用该操作符时,不会去掉结果集中的重复行。例子:将工资大于25000或职位是MANAGER的人找出来。sql语句:select ename, sal, job from emp where sal>2500 union all select ename, sal, job from emp where job='MANAGER';

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

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

相关文章

蓝桥杯第13届真题2

由硬件框图可以知道我们要配置LED 和按键 一.LED 先配置LED的八个引脚为GPIO_OutPut&#xff0c;锁存器PD2也是&#xff0c;然后都设置为起始高电平&#xff0c;生成代码时还要去解决引脚冲突问题 二.按键 按键配置&#xff0c;由原理图按键所对引脚要GPIO_Input 生成代码&a…

Linux的Shell编程

一、什么是Shell 1、为什么要学习Shell Linux运维工程师在进行服务器集群管理时&#xff0c;需要编写Shell程序来进行服务器管理。 对于JavaEE和Python程序员来说&#xff0c;工作的需要。Boss会要求你编写一些Shell脚本进行程序或者是服务器的维护&#xff0c;比如编写一个…

PDFMathTranslate 安装、使用及接入deepseek

PDFMathTranslate 安装、使用及接入deepseek 介绍安装及使用接入deepseek注意 介绍 PDFMathTranslate 是非常好用的科学 PDF 文档翻译及双语对照工具&#xff0c;可以将论文按照其原本的排版结构执行多种语言翻译&#xff0c;并且可以接入如&#xff1a;谷歌翻译、deepl、deep…

如何查看安卓版本号的方法(例如查看是13、12、11、10...)

开发过程中需要了解到安卓版本号是多少&#xff0c;那么以下有三种方法可以知晓安卓手机的Android版本号。 方法1&#xff1a;手机设置直接查看 1.打开【设置】 --> 滑动到手机最底部 --> 点击【关于手机】或 【系统】--> 选择【Android版本】 2.直接查看版本号&am…

Python----计算机视觉处理(Opencv:形态学变换)

一、形态学变化 形态学变换&#xff08;Morphological Transformations&#xff09;是一种基于形状的图像处理技术&#xff0c;主要处理的对象为二值化图像。 形态学变换有两个输入和一个输出&#xff1a;输入为原始图像和核&#xff08;即结构化元素&#xff09;&#xff0c;输…

【新能源汽车“心脏”赋能:三电系统研发、测试与应用匹配的恒压恒流源技术秘籍】

新能源汽车“心脏”赋能&#xff1a;三电系统研发、测试与应用匹配的恒压恒流源技术秘籍 在新能源汽车蓬勃发展的浪潮中&#xff0c;三电系统&#xff08;电池、电机、电控&#xff09;无疑是其核心驱动力。而恒压源与恒流源&#xff0c;作为电源管理的关键要素&#xff0c;在…

Android的消息机制

Android的消息机制-从入门到精通 前言Android消息机制概述Android 的消息机制分析ThreadLocal 的工作原理消息队列的工作原理Looper的工作原理Handler的工作原理 主线程的消息循环 前言 作为开发者&#xff0c;提及Android的消息机制&#xff0c;必然绕不开Handler&#xff0c;…

es-将知识库中的数据转换为向量存储到es并进行相似性检索

目录 为什么要将数据转为向量存入es? 数据准备 创建索引库 向量存储 验证 为什么要将数据转为向量存入es? 我之前把数据作为文档存入 ES&#xff0c;主要用于全文检索&#xff08;BM25 算法&#xff09;&#xff0c;但是它不适合语义匹配&#xff0c;比如如果用户输入的…

【资料分享】全志科技T113-i全国产(1.2GHz双核A7 RISC-V)工业核心板规格书

核心板简介 创龙科技SOM-TLT113 是一款基于全志科技T113-i 双核ARM Cortex-A7 玄铁C906 RISC-V HiFi4 DSP 异构多核处理器设计的全国产工业核心板&#xff0c;ARM Cortex-A7 处理单元主频高达1.2GHz。核心板 CPU、ROM、RAM、电源、晶振等所有元器件均采用国产工业级方案&…

wepy微信小程序自定义底部弹出框功能,显示与隐藏效果(淡入淡出,滑入滑出)

视图html部分 <view class"salePz"><view class"btnSelPz" tap"pzModelClick">去选择</view><!-- modal --><view class"modal modal-bottom-dialog" hidden"{{hideFlag}}"><view class&q…

基于Springboot+Typst的PDF生成方案,适用于报告打印/标签打印/二维码打印等

基于SpringbootTypst的PDF生成方案&#xff0c;适用于报告打印/标签打印/二维码打印等。 仅提供后端实现 Typst2pdf-for-report/label/QR code github 环境 JDK11linux/windows/mac 应用场景 适用于定制化的报告模板/标签/条码/二维码等信息的pdf生成方案。通过浏览器的p…

leetcode每日一题:使字符串平衡的最小交换次数

引言 今天开始&#xff0c;打算做一个新的系列&#xff1a;leetcode每日一题的题解。预期每天用90分钟的时间&#xff0c;去写一篇当天的每日一题的题解&#xff0c;这个目标跟早起结合在一起&#xff0c;才有足够的时间完成。其实早在前几年&#xff0c;就开始断断续续做leetc…

Learn Redis 5 (Java)

分布式锁 在面对高并发业务时&#xff0c;单个项目解决不过来&#xff0c;此时一个项目部署到多个机器&#xff0c;这就是集群模式&#xff0c;不同的项目实例就会对应不同的端口和JVM。 1.模拟集群模式 Nginx实现负载均衡&#xff08;轮询&#xff09; 2.使用集群模…

lua学习(三)

错误处理 assert断言 作用&#xff1a;确保某些数据是符合预期的&#xff0c;避免影响最终结果。 格式&#xff1a;assert(条件语句&#xff0c;报错信息) 当条件语句为true时&#xff0c;assert语句不会有任何行为&#xff0c;但是当为false时&#xff0c;assert会将报错信息…

基于eNSP的IPV4和IPV6企业网络规划

基于eNSP的IPV4和IPV6企业网络规划 前言网络拓扑设计功能设计技术详解一、网络设备基础配置二、虚拟局域网&#xff08;VLAN&#xff09;与广播域划分三、冗余协议与链路故障检测四、IP地址自动分配与DHCP相关配置五、动态路由与安全认证六、广域网互联及VPN实现七、网络地址转…

优选算法合集————双指针(专题四)

1&#xff0c;一维前缀和模版 题目描述&#xff1a; 描述 给定一个长度为n的数组a1,a2,....ana1​,a2​,....an​. 接下来有q次查询, 每次查询有两个参数l, r. 对于每个询问, 请输出alal1....aral​al1​....ar​ 输入描述&#xff1a; 第一行包含两个整数n和q. 第二行…

Web3游戏行业报告

一&#xff0c;gamefi经济 什么是gamefi GameFi是一个缩写&#xff0c;它结合了游戏和去中心化金融(“DeFi”)这两个术语&#xff0c;关注的是游戏玩法如何在去中心化系统中实现货币化。对于游戏而言&#xff0c;只要开放了交易市场&#xff0c;允许玩家自由买卖&#xff0c;…

【程序人生】成功人生架构图(分层模型)

文章目录 ⭐前言⭐一、根基层——价值观与使命⭐二、支柱层——健康与能量⭐三、驱动层——学习与进化⭐四、网络层——关系系统⭐五、目标层——成就与财富⭐六、顶层——意义与传承⭐外层&#xff1a;调节环——平衡与抗风险⭐思维导图 标题详情作者JosieBook头衔CSDN博客专家…

拖拽实现+摇杆实现

拖拽实现 拖拽事件实现: 半透明渐变贴图在ios设备下&#xff0c;使用压缩会造成图片质量损失&#xff0c;所以可以将半透明渐变UI切片单独制作真彩色图集 拖拽事件组 IBeginDragHandler:检测到射线后&#xff0c;当拖拽动作开始时执行一次回调函数 IDragHandler:拖拽开始后&a…

vs2017版本与arcgis10.1的ArcObject SDK for .NET兼容配置终结解决方案

因电脑用的arcgis10.1,之前安装的vs2010正常能使用AO和AE&#xff0c;安装vs2017后无法使用了&#xff0c;在重新按照新版本arcgis engine或者arcObject费时费力&#xff0c;还需要重新查找资源。 用vs2017与arc10.1的集成主要两个问题&#xff0c;1&#xff1a;安装后vs中没有…