MySQL·复合查询

news2024/11/27 8:41:53

目录

基本查询回顾

案例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而言,会多几行数据出来,因为没有进行去除操作

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

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

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

相关文章

『先进技术助力』Kompas AI:智能AI代理在工作中的应用与效率提升

『智能化未来』Kompas AI如何改变我们的工作方式&#xff1f; 在这个信息时代&#xff0c;利用AI聊天机器人来处理机械性的工作已经成为一种趋势。ChatGPT作为一种智能助手&#xff0c;不仅能够提高工作效率&#xff0c;还可以帮助我们更明智地做出决策&#xff0c;从而释放出更…

【MySQL数据库】丨一文详解 JdbcTemplate(Spring中的CRUD)

前言 JdbcTemplate 是 Spring框架 中提供的一个对象&#xff0c;用于简化JDBC操作。它使得数据库操作变得更为简单和方便&#xff0c;大大提高了开发效率。 文章目录 前言为何要使用JdbcTemplate在JdbcTemplate中执行SQL语句的方法大致分为3类&#xff1a;案例代码 JdbcTemplat…

活字格中如何加入JavaScript的代码和事件以及如何调试

活字格&#xff1a; 如何加入JavaScript的代码和事件 1&#xff09;选中组件。 2&#xff09;编辑命令“按钮。 3&#xff09;选择JavaScript命令&#xff0c;并点亮五星。 4&#xff09;编写js代码&#xff0c;确定。 5&#xff09;运行。 如何查看js运行&#xff1a; …

【R语言】边缘概率密度图

边缘概率密度图是一种在多变量数据分析中常用的图形工具&#xff0c;用于显示每个单独变量的概率密度估计。它通常用于散点图的边缘&#xff0c;以便更好地理解单个变量的分布情况&#xff0c;同时保留了散点图的相关性信息。 在边缘概率密度图中&#xff0c;每个变量的概率密度…

基于TL431和CSA的恒压与负压输出

Hello uu们,51去那里玩了呀?该收心回来上班了,嘿嘿! 为什么会有这个命题,因为我的手头只有这些东西如何去实现呢?让我们一起来看电路图吧.电路图如下图1所示 图1:CSA恒压输出电路 图1中,R1给U2提供偏置,Q1给R1提供电流,当U1-VOUT输出大于2.5V时候,U2内部的三极管CE导通,使得…

存储和NFS共享

存储类型 存储类型分为三种 直连式存储&#xff1a;Direct-Attached Storage&#xff0c;简称DAS网络附加存储&#xff1a;Network-Attached Storage&#xff0c;简称NAS存储区域网络&#xff1a;Storage Area Network&#xff0c;简称SAN DAS:存储和主机是直连的&#xff0…

安全数据交换系统哪个好?该如何选型?

安全数据交换系统是用于在不同网络或组织之间安全、高效地传输和共享数据的解决方案。安全数据交换系统对于任何需要处理敏感数据、确保数据安全、并满足合规要求的组织来说都是至关重要的。 这种系统通常用于以下目的&#xff1a; 1&#xff09;数据传输&#xff1a;允许用户…

Midjourney Imagine API 申请及使用

Midjourney Imagine API 申请及使用 申请流程 要使用 Midjourney Imagine API&#xff0c;首先可以到 Midjourney Imagine API 页面点击「Acquire」按钮&#xff0c;获取请求所需要的凭证&#xff1a; 如果你尚未登录或注册&#xff0c;会自动跳转到登录页面邀请您来注册和登…

【mysql】mysql导入导出数据详解

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

计算机毕业设计系列~~~基于SSM的宠物销售网站

目录 一、项目介绍 二、开题报告 三、项目截图 一、项目介绍 本项目是一款基于SSM的宠物销售网站&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1. 包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2. …

Web实时通信的学习之旅:WebSocket入门指南及示例演示

文章目录 WebSocket的特点1、工作原理2、特点3、WebSocket 协议介绍4、安全性 WebSocket的使用一、服务端1、创建实例&#xff1a;创建一个webScoket实例对象1.1、WebSocket.Server(options[&#xff0c;callback])方法中options对象所支持的参数1.2、同样也有一个加密的 wss:/…

llama.cpp制作GGUF文件及使用

llama.cpp的介绍 llama.cpp是一个开源项目&#xff0c;由Georgi Gerganov开发&#xff0c;旨在提供一个高性能的推理工具&#xff0c;专为在各种硬件平台上运行大型语言模型&#xff08;LLMs&#xff09;而设计。这个项目的重点在于优化推理过程中的性能问题&#xff0c;特别是…

【Oracle直播课】5月19日Oracle 19c OCM认证大师课 (附课件预览)

Oracle 19c OCM认证大师培训 - 课程体系 - 云贝教育 (yunbee.net) 部分课件预览 OCM部分课件预览 Oracle Database 19c Certified Master Exam (OCM) 认证大师 25 天 / 150课时 什么是Oracle 19c OCM&#xff1f; Oracle Certified Master (OCM)是Oracle认证大师&#xff0c;…

东南亚电商市场新趋势:自养号测评助力Shopee和Lazada卖家脱颖而出

在东南亚电商市场中&#xff0c;Shopee和Lazada无疑是两大巨头。对于卖家而言&#xff0c;如何在竞争激烈的平台上脱颖而出&#xff0c;提升产品曝光度和销量&#xff0c;一直是他们关注的焦点。而自养号测评作为一种有效的营销手段&#xff0c;正逐渐被越来越多的卖家所采用。…

经济学SSCI期刊,中科院3区,IF=2+,难度不大,收稿范围广泛!

一、期刊名称 Information Economics and Policy 二、期刊简介概况 期刊类型&#xff1a;SSCI 学科领域&#xff1a;经济学 影响因子&#xff1a;2.8 中科院分区&#xff1a;3区 出版方式&#xff1a;订阅模式/开放出版 版面费&#xff1a;选择开放出版需支付$3190 三、…

Spring Boot 中集成 EasyExcel 实现 Excel 文件读写操作

&#x1f341; 作者&#xff1a;知识浅谈&#xff0c;CSDN签约讲师&#xff0c;CSDN博客专家&#xff0c;华为云云享专家&#xff0c;阿里云专家博主 &#x1f4cc; 擅长领域&#xff1a;全栈工程师、爬虫、ACM算法 &#x1f492; 公众号&#xff1a;知识浅谈 &#x1f525; 微…

【QA】Java集合常用的函数

文章目录 前言Collection接口通用函数 | Collections工具类通用函数 | List接口 Set接口List接口ArrayListLinkedList Set接口TreeSetHashSetLinkedHashSet Map接口通用函数TreeMapHashMapLinkedHashMap 前言 本文介绍Java集合中常用的函数。 Collection接口 通用函数 | Co…

正点原子Linux学习笔记(七)在 LCD 上显示 png 图片

在 LCD 上显示 png 图片 21.1 PNG 简介21.2 libpng 简介21.3 zlib 移植下载源码包编译源码安装目录下的文件夹介绍移植到开发板 21.4 libpng 移植下载源码包编译源码安装目录下的文件夹介绍移植到开发板 21.5 libpng 使用说明libpng 的数据结构创建和初始化 png_struct 对象创建…

Mysql 8.0 -- 最新版本安装(保姆级教程)

Mysql 8.0 -- 最新版本安装&#xff08;保姆级教程&#xff09; ​​ 一&#xff0c;下载Mysql数据库&#xff1a; 官网链接&#xff1a;https://www.mysql.com/downloads/ 二&#xff0c;安装Mysql: 三&#xff0c;找到Mysql安装目录&#xff1a; 找到mysql安装目录&#xf…

Chronos:学习时间序列的大语言模型(代码解析)

前言 《Chronos: Learning the Language of Time Series》原文地址&#xff0c;Github开源代码地址Chronos&#xff1a;学习时间序列的大语言模型&#xff08;论文解读&#xff09;CSDN地址GitHub项目地址Some-Paper-CN。本项目是译者在学习长时间序列预测、CV、NLP和机器学习…