初识MYSQL —— 复合查询 - 详解

news/2025/12/7 13:17:43/文章来源:https://www.cnblogs.com/tlnshuju/p/19318000

初识MYSQL —— 复合查询 - 详解

2025-12-07 13:04  tlnshuju  阅读(0)  评论(0)    收藏  举报

前言

这里简单回顾一下基本查询的内容:(whereorder bygroup by等等)

练习

这里依旧使用empdeptnosalgrade三张表来做练习

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

根据要求可以分析出来筛选条件:

  • 工资高于500或者岗位是MANAGER;sal>500 or job='MANAGER'
  • 姓名的首字母为大写的Jname like 'J%'

这两个筛选条件要同时满足。

select * from emp where (sal>500 or job='MANAGER') and ename like 'J%';

在这里插入图片描述

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

根据要求,按照部门号升序、雇员工资降序排序。

select * from emp order by deptno asc, sal desc;

在这里插入图片描述

3. 按照年薪进行降序排序

按照年薪进行降序排序;

年薪 = 月薪*12 + 奖金(根据实际情况来定)

emp表中,comm列是存在NULL的,这里就要进行判断;

使用ifnull函数,如果为NULL就返回0

这里order by执行顺序在select之后,可以使用别名。

select ename,sal*12+ifnull(comm,0) as 年薪 from emp order by 年薪 desc;

在这里插入图片描述

4. 显示工资最高的员工的名字和工作岗位

根据需求,我们应该要想到一个问题:工资最高的员工可能有很多人;(不能使用order by根据薪资排序,然后取第一行)

这里可以先查询最高工资是多少,然后再使用where进行筛选。

这里使用子查询最好;

简单来说就是一次查询的结果作为条件、表结构。

select ename,job from emp where sal=(select max(sal) from emp);

5. 显示工资高于平均工资的员工信息

根据需求,我们可以先查询平均工资,让再查询使用where筛选工资大于平均工资的员工。

使用子查询

select * from emp where sal>(select avg(sal) from emp);

在这里插入图片描述

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

首先根据部门编号进行分组,然后使用聚合函数maxavg求最高工资和平均工资。

select deptno,avg(sal),max(sal) from emp group by deptno;

在这里插入图片描述

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

先根据部门编号进行分组,然后使用avg求出平均工资,最后再使用having对结果进行筛选。

select deptno,avg(sal) as 平均工资 from emp group by deptno having 平均工资<2000;

在这里插入图片描述

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

按照部门编号进行分组,然后使用count统计人数,avg求平均工资

select deptno,count(*) as 人数, avg(sal) as 平均工资 from emp group by deptno;

在这里插入图片描述

一、多表查询

在实际的应用场景中,数据往往来自不同的表,就注定需要多表查询。

例如:查询员工名、员工薪资以及所在部门的名字

其中员工名、员工薪资在表emp中,而部门名在表dept,这里就要联合查询

多表查询select * from emp, dept;是将两种表中数据做笛卡尔积(第一张表中的每一条数据和第二张表中的每一条数据进行组合)

笛卡尔积中有很多数据在这里是不合理的,例如20部门的SMITH,和1030部门信息进行组合。

这里我们只需要emp.deptno = dept.deptno的数据,就可以对两张表笛卡尔积的结果(新表)进行条件筛选。

select emp.ename,emp.sal,dept.deptno,dept.dname from emp,dept where emp.deptno=dept.deptno;

1. 查询部门号为10的部门名,员工名和工资

首先要查询的数据来自表empdept,做笛卡尔积然后筛选合理的数据;

然后,对形成的新表做条件筛选,筛选出部门号deptno=10的数据。

select dname,ename,sal from emp,dept where emp.deptno=dept.deptno and emp.deptno=10;

2. 查询各个员工的姓名,工资,及工资级别

要查询的数据来自表emp和表salgrade

这里要获取工资级别,筛选合理数据的条件为:sal>losal and sal<hisal

select ename,sal,grade from emp,salgrade where sal>losal and sal<hisal;

在这里插入图片描述

二、自连接

上述操作,要查询数据来自两张不同的表,两张不同的表做笛卡尔积。

而自连接,简单来说就是一张表自己和自己做笛卡尔积。

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

要查询的数据都在表emp中,这里就需要emp表自己和自己做笛卡尔积;(需要给表取别名

select emp1.ename,emp2.empno,emp2.ename from emp as emp1, emp as emp2 where emp1.mgr=emp2.empno and emp1.ename='FORD';

在这里插入图片描述

当然这里也可以使用子查询,先查询员工FROD的上级领导的员工号;再根据查询到的员工号查询姓名和员工号。

select empno,ename from emp where empno=(select mgr from emp where ename='FORD');

三、子查询

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

简单来说就是将select查询的结果当中条件、新表等等再次使用。

1. 单行子查询

例如:查询和SMITH同一部门的员工;

首先要查询SMITH的部门编号,再将查询到的结果当做筛选条件,查询部门为该结果的员工。

select * from emp where deptno=(select deptno from emp where ename='SMITH');

在这里插入图片描述

2. 多行子查询

上面子查询返回的是一条记录,在作为筛选条件时可以使用=

如果自查询返回的是多条记录,就要使用allinany等关键字来进行判断了。

1. in关键字

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

10号部门中,存在多种岗位,使用子查询返回的就是多行数据;

这里要求和10部门的工作岗位相同,即和其中工作岗位一个相同即可。

in(数值1, 数值2, 数值3):判断是否是其中的一个。

不包含10部门自己的员工,最后判断部门编号是否不等于10即可。

select ename,job,sal,deptno from emp where job in(select job from emp where deptno=10) and deptno<> 10;

2. all关键字

all (数值1,数值2,数值3),前面跟>就表示大于所有数值才为true、跟<就表示小于所有数值才为true

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

select ename,sal,deptno from emp where sal> all(select sal from emp where deptno=30);

3. any关键字

any(数值1,数值2,数值3),前面跟>就表示大于其中一个数值就为true、跟<就表示小于其中一个数值就为true

查询工资比部门30的任意员工的工资高的员工的姓名、工资和部门号(包含自己部门的员工)`

select ename,sal,deptno from emp where sal > any(select sal from emp where deptno=30);

在这里插入图片描述

3. 多列子查询

单行自查询是指子查询只返回单列、单行数据;多行子查询是指返回单列多行数据;都是针对单列的。

多列子查询是指查询返回多列数据的子查询语句。

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

select ename from emp where (deptno,job) = (select deptno,job from emp where ename='SMITH') and ename<>'SMITH';

在这里插入图片描述

四、内外连接

表的连接分为内连接和外连接;

1. 内连接

内连接实际上就是利用where子句,对两种表的笛卡儿积进行筛选,上述的多表查询其实就是内连接。

select 字段 from db1 inner join db2 on 连接条件 and 其它条件;

案例:查询SMITH的名字和部门名称

这里可以按照上述多表查询的写法,两张表使用,隔开;也可以使用内连接,两张表使用inner join隔开。

select ename,dname from emp,dept where emp.deptno=dept.deptno and ename='SMITH';
select ename,dname from emp inner join dept where emp.deptno=dept.deptno and ename='SMITH';

ITH的名字和部门名称

这里可以按照上述多表查询的写法,两张表使用,隔开;也可以使用内连接,两张表使用inner join隔开。

select ename,dname from emp,dept where emp.deptno=dept.deptno and ename='SMITH';
select ename,dname from emp inner join dept where emp.deptno=dept.deptno and ename='SMITH';

在这里插入图片描述
本篇文章到这里就结束了,感谢支持
我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=2oul0hvapjsws

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

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

相关文章

洛谷 P7971 [KSN2021] Colouring Balls 题解

人生第一道蓝交互。 观察数据范围,可以考虑数据点分治,分别解决各个 Subtask。 Subtask 1 & 2 由于颜色块连续,当 query(l,r)==1 时必有 \([l,r]\) 的小球颜色全部相同。 于是双指针扫一遍即可,\(l\) 为当前颜…

P10190 [USACO24FEB] Target Practice II S

洛谷 首先进行分类讨论。 对于每个右上角的点,为了不让箭穿过箭靶,必须分配一只向下射的奶牛,即斜率为负数的奶牛。 右下角的点同理,只能选择斜率为正数的点。 对于左上角左下角,不管斜率为正还是负都可以射到。 …

仿生手的混合结构设计与神经形态触觉传感

研究人员开发了一种混合结构的仿生手,它结合了刚性和软体机器人的优点,并集成了三层触觉传感器和机器学习算法,能够像人类一样感知并自适应地抓握多种物体,准确率高达99.69%。感觉即相信:仿生手能“感知”所触之物…

P8272 [USACO22OPEN] Apple Catching G

洛谷 先考虑推导式子。 设我们选择的奶牛为 \(i\),选择的苹果是 \(j\)。 那么可以得到式子: \[|x_i-x_j|\le t_j-t_i \]直接拆掉绝对值,因为绝对值会取较大的值,所以不需要考虑二者大小关系的影响,然后即可推得两式…

材料科学每日总结--Day13--数据挖掘

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

原理图文档处理工具

原理图文档处理工具 原理图文档处理工具 原理图库文档处理工具 PCB文档处理工具 PCB库文档处理工具

P8187 [USACO22FEB] Robot Instructions S

洛谷 看到 \(1\le N\le 40\) 甚至部分分 \(N\le 20\) 而且只有选和不选两种情况,这不是折半是什么? 那么直接考虑最板子的折半,前面一半从起点直接暴力搜索是否选择,得到最后的位置,另一半从终点往回走,最后统计…

2025年3D扫描仪十大品牌权威排名:国产化替代首选TOP10

body { font-family: "Microsoft YaHei", Arial, sans-serif; line-height: 1.6; color: rgba(51, 51, 51, 1); max-width: 1200px; margin: 0 auto; padding: 20px; background-color: rgba(249, 249, 249,…

P8270 [USACO22OPEN] Subset Equality S

洛谷 发现字母的范围比较小,但是也没有小多少,那么多半是需要对字母组合求解。 第一想法就是给计入的字母状压,确认是否相同。 但是字符串长度又太长了,并且不好优化,只能放弃。 那么该怎么组合? 我们发现影响两…

P8271 [USACO22OPEN] COW Operations S

洛谷 蒟蒻给一个时间复杂度较劣的线段树做法。 我们可以发现两个字符处理的结果和处理的顺序没有关系,那么我们可以先考虑将每一部分都尝试合成一个或没有字符,再进行合并。 那么我们其实可以考虑使用线段树直接维护…

P10779 BZOJ4316 小 C 的独立集

洛谷 首先需要知道独立集是什么。 简单来讲独立集就是一个没有相邻的点的集合。 我们已经处理过比较多的独立集问题了。 比如常见的线性独立集。 代码: for(int i=1;i<=n;i++){dp[i][0]=max(dp[i-1][1],dp[i-1][0]…

街头徒手健身6倒立训练与肩部健康

6 倒立训练与肩部健康 这个世界纷繁复杂、充满变数,但有一条真理始终不变:宇宙总会竭力维持平衡,以此维系自身的稳定运转。我们的身体亦是如此 —— 必须让拮抗肌群之间保持力量平衡,才能维持正常的生理功能。而练…

AI语料优化新势力:助力企业抢占智能时代先机的优质服务商推荐

在人工智能技术飞速迭代的今天,AI搜索排名优化已成为企业数字化转型的核心竞争力之一,而高质量的语料优化则是撬动这一竞争力的关键支点。从geo优化带来的地域化精准触达,到针对DeepSeek、豆包、文心一言等主流AI模…

基于MATLAB的位同步提取方法

一、位同步技术概述 1. 基本概念 位同步(Bit Synchronization)是数字通信系统的核心技术,指从接收信号中提取与发送端码元定时一致的本地时钟信号,实现对接收码元的准确判决。其本质是解决定时相位模糊问题,确保抽…

Manim介绍

Manim是一个用于创建数学动画的Python库,其类架构设计围绕着场景(Scene)、对象(Mobject)和动画(Animation)这几个核心概念构建,以实现复杂数学可视化的需求。以下是对其主要类架构的详细解释: 1. Mobject 类基…

P2475 [SCOI2008] 斜堆

洛谷 提供一种在模拟赛上自己观察出来的方法。 由于树是递归定义的,并且每次加入一个值在这个子树中,左右儿子会调换,再将这个点加入左子树。因此我们每次加入一个节点,必须保证这个点未加入的左右子树的节点数量相…

P6803 [CEOI 2020] 星际迷航

洛谷 由于两个人都是绝对聪明的,所以每个人都只会做出最好的选择。 由于这个游戏在加完星门以后的情况已经确定了,所以开始时的树的形态以及开的星门就会直接导致游戏的胜负。 那么我们可以先处理出在根的胜负。 我们…

P4037 [JSOI2008] 魔兽地图

https://www.luogu.com.cn/problem/P4037 由题目可知整个合成路径可以看作一个森林。 对于答案的统计,我们在处理完每棵树的消耗费用对应的最大力量以后,使用一个背包即可。 这样我们就可以统计出答案了。 现在问题在…

CF1970E3 Trails (Hard)

Codeforces 对于 Easy 部分的做法: 很容易想到统计下来每个点的位置,枚举到达的点,然后进行转移统计即可。 时间复杂度 \(O(m^2n)\)。 由于个人习惯,代码中的 \(n\) 和 \(m\) 与原题目不同。 代码: #include<b…

双线性四边形等参单元程序(MATLAB实现)

双线性四边形等参单元是有限元分析中最常用的二维单元之一,通过自然坐标(ξ, η)与物理坐标(x, y)的映射,实现复杂形状的单元分析。MATLAB实现,包括形函数计算、坐标变换、雅可比矩阵构建、单元刚度矩阵求解等核…