MySQL·复合查询

目录

基本查询回顾

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

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

案例3:使用年薪进行降序排序

案例4:显示工资最高的员工的名字和工作岗位

案例5:显示工资高于平均工资的员工信息 

案例6:显示每个部门的平均工资和最高工资

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

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

多表查询

案例9:显示雇员名、雇员工资以及所在部门的名字

案例10:显示部门号为10的部门名,员工名和工资

案例11:显示各个员工的姓名,工资,及工资级别

自连接

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

子查询

单行子查询

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

多行子查询

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

补充1:in关键字(在集合中)

案例15:显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号

补充2:all关键字(表示所有)

案例16:显示工资比部门30的任意员工的工资高的员工的姓名、工资和部门号(包含自己部门的员工)

补充3:any关键字(任意)

多列子查询

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

在from子句中使用子查询

案例18:显示每个高于自己部门平均工资的员工的姓名、部门、工资、平均工资

案例19:查找每个部门工资最高的人的姓名、工资、部门、最高工资

案例20:显示每个部门的信息(部门名,编号,地址)和人员数量

合并查询

union

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

union all


本篇主要使用的表,参考下文中的雇员表

MySQL·表数据的操作-CSDN博客

基本查询回顾

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

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

当然我们还可以使用之前说的函数去筛选,结果是一样的

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

select * from EMP order by deptno, sal desc;

案例3:使用年薪进行降序排序

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

直接筛选是不行的,因为null不参与运算

需要使用ifnull函数

这样我们就得到了一张年薪表

我们再将这张表进行降序排序就好了,因为是先有数据再排序,所以我们可以直接使用重命名之后的名字进行排序

案例4:显示工资最高的员工的名字和工作岗位

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

传统思路分两步,首先查询最高工资的是多少,其次再用最高工资找到这个人,但是显然这种查询方式很粗糙,我们并不推荐这样去做 

我们可以在查询中嵌套一个子查询的方式来达到我们想要的结果

案例5:显示工资高于平均工资的员工信息 

select ename, sal from EMP where sal>(select avg(sal) from EMP);

案例6:显示每个部门的平均工资和最高工资

select deptno, format(avg(sal), 2) , max(sal) from EMP group by deptno;

我们还可以用format函数进行格式化

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

select deptno, avg(sal) as avg_sal from EMP group by deptno having
avg_sal<2000;

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

select job,count(*), format(avg(sal),2) from EMP group by job;

多表查询

实际开发中往往数据来自不同的表,所以需要多表查询。这一次我们用一个简单的公司管理系统,有三张表EMP,DEPT,SALGRADE来演示如何进行多表查询,三表参考本文开头注释

案例9:显示雇员名、雇员工资以及所在部门的名字

select EMP.ename, EMP.sal, DEPT.dname from EMP, DEPT where EMP.deptno =
DEPT.deptno;

因为上面的数据来自EMP和DEPT表,因此要联合查询

多表笛卡尔积会有很多不符合常理的数据也被关联起来,使用条件将他们筛选出来即可拿到我们想要的一张合并并且筛选过后的表

分析如下 

我们在将我们需要的数据拿出来即可

案例10:显示部门号为10的部门名,员工名和工资

select ename, sal,dname from EMP, DEPT where EMP.deptno=DEPT.deptno and
DEPT.deptno = 10;

案例11:显示各个员工的姓名,工资,及工资级别

select ename, sal, grade from EMP, SALGRADE where EMP.sal between losal and
hisal;

我们得使用下面这张表,表的来源参考文章的开头注释

薪资等级要在最低和最高工资之间 

自连接

自连接是指在同一张表连接查询

想要对一张表进行笛卡尔积的话,需要重命名,这种行为我们称之为自连接

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

注意:这里的mgr是员工领导的编号--empno

我们可以直接使用复合查询进行筛选

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

也可以使用自连接的方式进行查询 

-- 使用到表的别名
--from emp leader, emp worker,给自己的表起别名,因为要先做笛卡尔积,所以别名可以先识别 
select leader.empno,leader.ename from emp leader, emp worker where
leader.empno = worker.mgr and worker.ename='FORD';

子查询

单行子查询

返回一行记录的子查询

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

select * from EMP WHERE deptno = (select deptno from EMP where
ename='smith');

传统分两步,先找到SMITH对应的部门号,再用部门号进行筛选

我们可以使用复合查询来实现这两步

多行子查询

返回多行记录的子查询

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

select ename,job,sal,deptno from emp where job in (select distinct job from
emp where deptno=10) and deptno<>10;
补充1:in关键字(在集合中)

最后再去除10号部门

案例15:显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号

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

同理,我们可以分两步完成查询,先找到30号部门的最高工资,再用最高工资去筛选高于该工资的人员

合并起来,使用复合查询得到下面这种查找方法

补充2:all关键字(表示所有)

案例16:显示工资比部门30的任意员工的工资高的员工的姓名、工资和部门号(包含自己部门的员工)

select ename, sal, deptno from EMP where sal > any(select sal from EMP where
deptno=30);
补充3:any关键字(任意)

多列子查询

单行子查询是指子查询只返回单列,单行数据;

多行子查询是指返回单列多行数据,都是针对单列而言的,而多列子查询则是指查询返回多个列数据的子查询语句

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

第一步:找到部门 

第二步:找到SMITH本人

第三步:复合查询

当然用in关键字也行

目前全部的子查询,全部都在where字句中充当判断,下面我们要介绍在from字句中使用子查询

在from子句中使用子查询

子查询语句出现在from子句中。这里要用到数据查询的技巧,把一个子查询当做一个临时表使用

案例18:显示每个高于自己部门平均工资的员工的姓名、部门、工资、平均工资

-- 获取各个部门的平均工资,将其看作临时表
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;

第一步:拿到各部门的平均工资

第二步: 用各部门的平均工资表与emp表做笛卡尔积,并筛选出正常的数据

注意第二张临时表需要重命名 

第三步:用这张表进行单行查询即可 

案例19:查找每个部门工资最高的人的姓名、工资、部门、最高工资

select EMP.ename, EMP.sal, EMP.deptno, ms from EMP,
(select max(sal) ms, deptno from EMP group by deptno) tmp
where EMP.deptno=tmp.deptno and EMP.sal=tmp.ms;

第一步:找到每个部门的最高工资

第二步:用这张临时表和emp表做笛卡尔积,并去除不合理的数据

第三步:用这张表进行当行查询 

案例20:显示每个部门的信息(部门名,编号,地址)和人员数量

方法一:多表子查询

-- 1. 对EMP表进行人员统计
select count(*), deptno from EMP group by deptno;
-- 2. 将上面的表看作临时表
select DEPT.deptno, dname, mycnt, loc from DEPT,
(select count(*) mycnt, deptno from EMP group by deptno) tmp
where DEPT.deptno=tmp.deptno;

第一步:先查询到每个部门的人数 

第二步:用这张临时表与dept表进行笛卡尔积,并过滤掉不合理的数据

第三步:找到需要的数据

方法2:使用多表

select DEPT.dname, DEPT.deptno, DEPT.loc,count(*) '部门人数' from EMP,
DEPT where EMP.deptno=DEPT.deptno
group by DEPT.deptno,DEPT.dname,DEPT.loc;

多表查询的指导思想:解决多表问题的本质:想办法将多表转化为单表,使用MySQL中,所有select的问题都可以转成单表问题

合并查询

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

union

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

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

select * from emp where sal>2500 union select * from emp where job='MANAGER';

分两步如下 

再做union

union all

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

如同,相比union而言,会多几行数据出来,因为没有进行去除操作

不过视乎没有什么区别,这两用点较少 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

TPI 系列——1W,3KVDC隔离 定电压输入,稳压双路输出DC-DC模块电源

TPI系列产品是专门针对PCB上需要与输入电源隔离的电源应用场合而设计的。该产品适用于&#xff1a;1&#xff09;输入电源的电压变化≤5%&#xff1b;2&#xff09;输入输出之间要求隔离电压≥3000VDC&#xff1b;3&#xff09;对输出电压稳定和输出纹波噪声要求高.

多商户Docker Supervisor进程管理器部署

Dockerfile 根目录下没有Dockerfile的可以复制下面的命令 # 使用基础镜像 FROM leekay0218/crmeb-mer## 复制代码 ## 在本地调试注释掉&#xff0c;使用映射把文件映射进去 #ADD ./ /var/www# 设置工作目录 WORKDIR /var/www# 设置时区为上海 ENV TZAsia/Shanghai RUN ln -sn…

Porto主题下载: 打造您网站的独特魅力

在数字时代&#xff0c;一个吸引人的网站是您品牌故事的开端。Porto&#xff0c;一款专为追求卓越设计和功能性的WordPress主题&#xff0c;让您的网站从众多竞争者中脱颖而出。 响应式设计 Porto主题采用最先进的响应式设计技术&#xff0c;确保您的网站在任何设备上都能提供…

Hive两代命令行客户端(Hive、Beeline)

Hive命令行客户端 Hive有两个主要的客户端工具&#xff0c;分别是旧版的Hive CLI&#xff08;Command Line Interface&#xff09;和新版的Beeline。 1. Hive CLI&#xff1a; Hive CLI 是 Hive 最早期的命令行客户端工具&#xff0c;它使用 JDBC 连接到 Hive 服务器&#xff…

[嵌入式系统-72]:ARM芯片选型基础

目录 一、ARM概述 1.1 ARM介绍 1.2 ARM芯片的特点 1.3 ARM芯片的商业模式 1.4 ARM的发展历史 二、ARM架构 2.1 ARM SOC芯片的架构 2.2 ARM核的架构 三、ARM核的架构演进 3.1 经典ARM处理器ARMx 3.2 嵌入式ARM处理器Cortex-Mx系列&#xff1a;微控制器 3.3 嵌入式AR…

AI图书推荐:重塑—利用生成式AI构建产品

你知道吗&#xff0c;将人工智能融入产品已经成为全球企业的关键战略&#xff1f;埃森哲 (Accenture) 2023 年的一项研究显示&#xff0c;高达 75%的高管认为&#xff0c;如果在未来五年内未能有效整合人工智能&#xff0c;企业可能会被淘汰。 《重塑&#xff1a;利用生成式人工…

魔法程序员的奥妙指南:Java基本语法

作为一名魔法程序员&#xff0c;精通Java语言是至关重要的。Java作为一种强大的编程语言&#xff0c;在编写优质代码和开发强大应用程序时发挥着重要作用。让我们深入探讨Java基本语法的关键要点&#xff0c;从注释到变量&#xff0c;无所不包&#xff01; Java基本语法的神秘魔…

可重入分布式锁有哪些应用场景

原文连接&#xff1a;可重入分布式锁有哪些应用场景 https://mp.weixin.qq.com/s/MTPS9V8jn5J91wr-UD4DyA 之前发过的一篇实现Redis分布式锁的8大坑中&#xff0c;有粉丝留言说&#xff0c;分布式锁的可重入特性在工作中有哪些应用场景&#xff0c;那么我们这篇文章就来看一下…

IP定位技术在打击网络犯罪中的作用

随着互联网的普及和信息技术的发展&#xff0c;网络犯罪日益猖獗&#xff0c;给社会治安和个人财产安全带来了严重威胁。而IP定位技术的应用为打击网络犯罪提供了一种有效手段。IP数据云将探讨IP定位技术在打击网络犯罪中的作用及其意义。 1. IP定位技术的原理 IP&#xff08…

Windows下安装httpd

一、下载http安装包 1、下载地址 Welcome! - The Apache HTTP Server Project 2、点击“Download” 3、选择对应httpd服务&#xff0c;点击“Files for Microsoft Windows” 4、选择“Apache Lounge”&#xff0c;进入下载页面 5、点击“httpd-2.4.59-240404-win64-VS17.zip …

日本站群服务器提升网站用户体验的选择

日本站群服务器提升网站用户体验的选择 在当今数字化时代&#xff0c;网站的性能和用户体验对于在线业务的成功至关重要。为了确保网站能够提供快速、可靠和高效的访问体验&#xff0c;越来越多的网站管理员和企业选择了使用站群服务器。本文将深入探讨日本站群服务器的独特优…

网络安全之OSI七层模型详解

OSI七层模型分为控制层&#xff08;前三层&#xff09;和数据层&#xff08;后四层&#xff09;。从第七层到一层为&#xff1b; 应用层&#xff08;7&#xff09;接收数据 表示层&#xff08;6&#xff09;将数据翻译为机器语言 会话层&#xff08;5&#xff09;建立虚连接…

如何编辑百度百科并提供参考资料

大家都知道参考资料是创建百度百科中最重要的一步&#xff0c;百度百科只收录可以找到资料来源的事实&#xff0c;参考资料的意义在于&#xff0c;指出该部分内容的来源/出处&#xff0c;从而保障这段内容是客观真实的。 注册和登录百度账号 首先&#xff0c;你需要在百度百科…

RuoYi-Vue-Plus (Echarts 图表)

一、echarts 图表介绍和使用 官网地址:目前echarts以及贡献给Apache Apache EChartshttps://echarts.apache.org/zh/index.htmlecharts配置项手册 Documentation - Apache EChartshttps://echarts.apache.org/z

台球桌上的答案 如何优化图形化编程对复杂程序的展现

在公司的休息区&#xff0c;卧龙和凤雏正站在台球桌旁&#xff0c;一场激战即将打响。 “来吧&#xff0c;凤雏&#xff0c;让我们一决高下&#xff01;”卧龙手持台球杆&#xff0c;面带自信的微笑&#xff0c;向凤雏发起挑战。 凤雏点了点头&#xff0c;拿起台球杆&#xff0…

泰迪科技2024中职大数据实训室方案解读

中职在大数据专业建设所遇到的困难 数据、信息安全、人工智能等新信息技术产业发展迅猛&#xff0c;人才极其匮乏&#xff0c;各个中职院校纷纷开设相应的专业方向。但是&#xff0c;绝大多数院校因为师资和积累问题&#xff0c;在专业建设规划、办学特色提炼、创新教学模…

Objective-C的对象复制与拷贝选项

对象复制与拷贝 文章目录 对象复制与拷贝copy与mutablecopycopy与mutablecopy的简介示例&#xff1a;不可变对象的复制可变对象的复制 NSCopying和NSMutableCopying协议深复刻和浅复刻浅拷贝&#xff08;Shallow Copy&#xff09;&#xff1a;深拷贝&#xff08;Deep Copy&…

AI智能分析高精度烟火算法EasyCVR视频方案助力打造森林防火建设

一、背景 随着夏季的来临&#xff0c;高温、干燥的天气条件使得火灾隐患显著增加&#xff0c;特别是对于广袤的森林地区来说&#xff0c;一旦发生火灾&#xff0c;后果将不堪设想。在这样的背景下&#xff0c;视频汇聚系统EasyCVR视频融合云平台AI智能分析在森林防火中发挥着至…

APScheduler定时器使用【重写SQLAlchemyJobStore版】:django中使用apscheduler,使用mysql做存储后端

一、环境配置 python3.8.10 包&#xff1a; APScheduler3.10.4 Django3.2.7 djangorestframework3.15.1 SQLAlchemy2.0.29 PyMySQL1.1.0 项目目录情况 gs_scheduler 应用 commands &#xff1a; 主要用来自定义命令&#xff0c;python manage.py crontab schedulers&#…

20240509解决Protel99se导入philips.ddb出现File is not recognized的问题

20240509解决Protel99se导入philips.ddb出现File is not recognized的问题 2024/5/9 16:25 缘起&#xff1a;最近需要用到/画PCB&#xff0c;想到十年前用过Protel99SE。 使用的系统&#xff1a;WIN10/WIN11都会出错。WIN7没有测试&#xff01; 从115网盘的角落里找到七集视频…