【MySQL复合查询】

文章目录

  • 一、基本的使用案例
  • 二、多表查询
  • 三、自连接
  • 四、子查询
    • 4.1单行子查询
    • 4.2多行子查询
      • in关键字
      • all关键字
      • any关键字
    • 4.3多列子查询
      • 4.4 在from子句中使用子查询
  • 解决多表问题的本质
  • 五、合并查询
    • 1.union
    • 2.union all


一、基本的使用案例

注明:以下案例使用的均为一个scott.sql的资源文件。
其中一个表的内容如下:
在这里插入图片描述

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

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

在这里插入图片描述

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

mysql> select * from emp order by deptno asc,sal desc;
在这里插入图片描述

计算每一个人的年薪(年薪 = 月薪*12 + 奖金);

mysql> select ename,sal*12+ifnull(comm,0) from emp;
这里使用了ifnull函数,来判断如果comm为NULL,那就是0,如果不为NULL,那奖金就是comm。(因为在表创建奖金时,comm设置允许为NULL)
而前面讲过,NULL跟谁运算,结果都是NULL。
在这里插入图片描述

然后按照年薪,进行降序排序。

mysql> select ename,sal*12+ifnull(comm,0) as 年薪 from emp order by 年薪
desc;
在这里插入图片描述

子查询的两个经典案例:

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

这里分两步走:
1.先查出整个表中最高的薪资是多少。
2.遍历表,将每个员工工资与最高工资比较。
一般情况下就会分两步SQL代码来执行。
mysql> select max(sal) from emp ;
mysql> select ename,job from emp where sal=5000;

但是,这样执行太挫了。
不如这样:
mysql> select ename,job from emp where sal=(select max(sal) from emp);

这样执行的顺序是:先从括号内开始进行查询,最后再向外执行聚合。

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

mysql> select * from emp where sal > (select avg(sal) from emp);
计算平均工资的过程,就是把emp表分成一个小的表。
先从括号内进行分组选择,再进行聚合。
在这里插入图片描述

显示每个部门的平均工资和最高工资
分析:这里存在分组。
第一:每个部门,第二:平均工资,第三:最高工资。
其实就是把一个表分成三个表。
先获取部门这一个表,这是分组过程。
再在部门表中,获取平均工资和最高工资,这是聚合过程。
分组聚合是相辅相成的。

mysql> select deptno,format(max(sal),2) 最高工资,format(avg(sal),2) 平均工资
from emp group by deptno;
在这里插入图片描述

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

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

这里也考察了where和having的用法。

上篇文章说过,where和having区别就是使用时机不同。
where是分组聚合前使用,having是分组聚合后使用。

如果把上面的话变成这样:
显示部门和它的平均工资。
这样的含义就是:先分组,一个部门就是一个组,再在组内聚合计算平均工资。
现在增加了几个字:
显示平均工资低于2000的部门和它的平均工资。
显然,是先在组内聚合计算完平均工资后,再将最终结果与2000比较。
所以就是分组聚合后使用having。

在这里插入图片描述

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

mysql> select job,count(*) 人数,format(avg(sal),2) 平均工资 from emp group by job;

第一步:可以先计算一共有多少员工

select count(*) from emp;

第二步:按照岗位进行分组,计算每个岗位有多少员工

select count(*) from emp group by job;

第三步:汇总即可。
在这里插入图片描述

二、多表查询

案例:
显示雇员名、雇员工资以及所在部门的名字因为上面的数据来自EMP和DEPT表,因此要联合查询。

上面的案例,需要用到两张表的信息,所以需要查询两张表。

select * from emp,dept;

在这里插入图片描述
可以看到,查询结果是一张非常大的表格。

联合查询的过程是使用笛卡尔积的方式。

在这里插入图片描述
而每条数据都会进行这样的方式。
这就是为什么在联合查询出来的表,会出现多个dpetno,且部门号不同的原因,所以,那些deptno不同的数据是没有意义的。

mysql> select * from emp,dept where emp.deptno = dept.deptno;

在这里插入图片描述

所以才需要进行筛选,过滤掉所有deptno不同的数据。

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

显然,这个案例也需要联合查询。

mysql> select dname,ename,job from emp,dept where emp.deptno = dept.deptno and dept.deptno = 10;

在这里插入图片描述

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

mysql> select ename,sal,grade from emp,salgrade where sal between losal and hisal;
在这里插入图片描述

三、自连接

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

案例:
显示员工FORD的上级领导的编号和姓名(mgr是员工领导的编号–empno)

  • 1.先根据员工信息找到领导编号。
  • 2.根据领导编号,找到领导的信息。

方法1:

  • 使用子查询

mysql> select ename,empno from emp where empno=(select mgr from emp where ename=‘FORD’);

在这里插入图片描述

方法2:

  • 使用自查询

mysql> select e2.ename, e2.empno from emp e1,emp e2 where e1.ename = ‘FORD’ and e1.mgr = e2.empno;

from是最先被执行的,因为只有先找到表,才能执行接下来的其他所有操作!!!

所以,在select阶段,也可以使用重命名后的表。

注意:e1和e2虽然都是emp表的别名,但是经过笛卡尔积后,两个表不再是同一张表了!!

四、子查询

4.1单行子查询

返回一行记录的子查询。
单行子查询最显著的特征是:查询出来的结果只有一行一列。

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

  • 1.先找到SMITH的所在部门号。

在这里插入图片描述

  • 2.根据部门号,找到所有在该部门的员工。
    在这里插入图片描述
    合并的结果就是:

mysql> select * from emp where deptno = (select deptno from emp where ename = ‘SMITH’);

在这里插入图片描述

4.2多行子查询

in关键字

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

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

在这里插入图片描述

在这里插入图片描述

all关键字

all关键字的含义就是比所有值都要怎么怎么样。

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

mysql> select ename,sal,deptno from emp where sal > all(select sal from emp where deptno = 30);
在这里插入图片描述

any关键字

any关键字就是比一批人员中的任意一个高就行。

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

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

在这里插入图片描述
也可以加上一个distinct进行去重。

4.3多列子查询

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

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

mysql> select * from emp where (job,deptno) = (select job ,deptno from emp where ename = ‘SMITH’);

在这里插入图片描述

4.4 在from子句中使用子查询

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

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

mysql> select ename,deptno,job,sal from emp , (select deptno dt, avg(sal) avsal from emp group by deptno) tmp where emp.sal > tmp.avsal and emp.deptno = tmp.dt;
在这里插入图片描述

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

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

在这里插入图片描述

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

mysql> select * from dept t1, (select deptno dt, count(*) from emp
group by deptno) t2 where t1.deptno = t2.dt;

在这里插入图片描述

解决多表问题的本质

解决多表问题的本质:将多表转化成单表,所以MySLQ中,所有的select问题,都可以转化成单表问题。

五、合并查询

1.union

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

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

mysql> select * from emp where sal > 2500 union select * from emp where job = ‘MANAGER’;

在这里插入图片描述

2.union all

与union的区别就是不去重。


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

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

相关文章

Spring-依赖查找

依赖查找 根据名称进行查找 实时查找 BeanFactory beanFactory new ClassPathXmlApplicationContext("beans.xml"); Object bean beanFactory.getBean("personHolder"); System.out.println(bean);xml如下: <bean id"person" class&qu…

【数据可视化01】matplotlib实例介绍2

目录 一、引言二、实例介绍1.箱线图2.热力图3.线条形式 一、引言 接着上一文章【数据可视化01】matplotlib实例介绍1继续介绍matplotlib的实例。 二、实例介绍 在matplotlib中&#xff0c;常用的图形类型包括&#xff1a; 箱线图&#xff08;Box plot&#xff09;&#xff1…

非预警,这3本TOP期刊,为何走到On Hold这步?

本周投稿推荐 SSCI • 2区社科类&#xff0c;3.0-4.0&#xff08;社科均可&#xff09; EI • 计算机工程类&#xff08;接收广&#xff0c;录用极快&#xff09; SCI&EI • 4区生物医学类&#xff0c;1.5-2.0&#xff08;录用率99%&#xff09; • 1区工程类&#…

如何用时尚新姿讲好中国品牌故事?

品牌建设在推动高质量发展中扮演了双重角色&#xff0c;既是高质量发展的重要“承载者”&#xff0c;也是强有力的“助推器”。5月10日-11日&#xff0c;中国时尚品牌URBAN REVIVO&#xff08;以下简称UR&#xff09;以中国品牌日为起点&#xff0c;联合天猫超级品牌日&#xf…

Spring框架深度解析:打造你的Java应用梦工厂

想要在Java企业级应用开发中大展身手&#xff1f;Spring框架的核心容器是你不可或缺的伙伴&#xff01; 文章目录 一. 引言1.1 介绍Spring框架的重要性1.2 阐述核心容器在Spring框架中的作用1.3 故事开端 二. 背景介绍2.1 描述Spring框架的发展历程2.2 概述Spring框架的主要特点…

数学老师们

小学三年级之前的数学老师&#xff0c;包括学前班给过我零分的数学老师&#xff0c;模样、姓名都不记得了。能回忆起来的最早的数学老师是四、五年级的李成娥老师。 李老师四十岁左右&#xff0c;短发&#xff0c;温和、爱笑&#xff0c;尤其是在班主任张老师的衬托下&#xf…

有必要买超声波洗眼镜机吗?力荐四款实力超群超声波清洗机

在日常生活中&#xff0c;眼镜不仅仅是我们视野的延展&#xff0c;像太阳眼镜&#xff0c;也是有着独特的作用。但是&#xff0c;在每天的使用过程中&#xff0c;眼镜片表面难免会有灰尘&#xff0c;污迹&#xff0c;甚至油渍&#xff0c;这些都会对镜片的材质产生一定的损伤&a…

宝塔面板各种疑难杂症处理命令教程

下载地址&#xff1a;宝塔面板各种疑难杂症处理命令教程 这份宝塔面板各种疑难杂症处理命令教程&#xff0c;可以解决市面上遇到的各种难题&#xff0c;建议有技术能行的下载使用&#xff0c;小白也可以下载来学习可以帮助你解决宝塔面板遇到的各种难题

网络端口占用问题的综合调研与解决方案

原创 Randy 拍码场 问题背景 去年底信息安全团队进行网络权限治理&#xff0c;要求所有应用实例使用静态IP&#xff0c;公网访问策略与静态IP绑定&#xff1b;之后实例重启时偶现“端口被占用”错误。通过分析总结应用日志&#xff0c;共有以下4种错误类型&#xff0c;实质都是…

Apple store 静安·苹果店欣赏

官网&#xff1a; https://www.apple.com/today/Apple 亚洲第一大商店&#xff1a;Apple 静安零售店现已在上海开幕 静安苹果欣赏

LVGL移植到ARM开发板(GEC6818)

源码下载&#xff1a;点击跳转 下载好三个文件后&#xff0c;将其解压缩&#xff0c;并合到一个文件夹里面—— 1、修改 Makefile 删除 -Wshift-negative-value 2、修改 main.c 3、修改 lv_drv_conf.h 在lv_drv_conf.h文件屏幕驱动文件刚好与开发板LCD驱动文件一致&#xff0c…

【操作指南】银河麒麟高级服务器操作系统内核升级——基于4.19.90-17升级

1. 升级清单 升级包及依赖包清单如下。 kernel ARM架构 kernel-core-4.19.90-23.18.v2101.ky10.aarch64.rpm kernel-modules-4.19.90-23.18.v2101.ky10.aarch64.rpm kernel-4.19.90-23.18.v2101.ky10.aarch64.rpm kernel-modules-extra-4.19.90-23.18.v2101.ky10.aarch64.r…

【小笔记】neo4j用load csv指令导入数据

【小笔记】neo4j用load csv指令导入数据 背景 很久没有用load CSV的方式导入过数据了因为它每次导入有数量限制&#xff08;印象中是1K还是1W&#xff09;&#xff0c;在企业中构建的图谱往往都是大规模的&#xff0c;此时通常采用的是Neo4j-admin import方式。最近遇到了一些…

《二》菜单模块设计实现---添加动作函数等

在菜单栏中&#xff0c;比如&#xff1a; 我们要添加很多像新建&#xff0c;打开&#xff0c;粘贴&#xff0c;复制&#xff0c;加粗&#xff0c;下划线的动作&#xff0c;所以首先我们需要添加一些头文件&#xff1a; #include <QMainWindow> #include"mychild.h&…

麒麟信安连续四年被授予湖南省、长沙市“守合同重信用企业”双重荣誉称号

以诚为本&#xff0c;以信立身&#xff0c;**麒麟信安经过多年的市场积累&#xff0c;凭借健全的市场主体信誉机制&#xff0c;良好的社会信誉和合同履约能力&#xff0c;连续四年获评长沙市“守合同重信用”公示企业&#xff08;2023年度&#xff09;、湖南省“守合同重信用”…

OpenAI 或将推出多模态人工智能数字助理;研究发现部分 AI 系统已学会「说谎」丨 RTE 开发者日报 Vol.203

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE&#xff08;Real Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

海洋环境保护论文阅读记录

海洋环境保护 论文1&#xff1a;Critical role of wave–seabed interactions in the extensive erosion of Yellow River estuarine sediments 波浪-海床相互作用在黄河河口广泛侵中的关键作用 estuatine 河口的&#xff0c;港湾的 erodibility侵蚀度 sediment erodibility …

速了解及使用布隆过滤器

布隆过滤器 介绍 概念&#xff1a;是一种高效查询的数据结构 作用&#xff1a;判断某个元素是否在一个集合中。&#xff08;但是会出现误判的情况&#xff09; 实现原理 加入元素&#xff1a; 当一个元素需要加入到布隆过滤器中时&#xff0c;会使用一组哈希函数对该元素进…

自媒体从0-1起号全流程落地指南。(含工具)

下面开始进入主题&#xff1a; 一、持续涨粉的技巧 持续账号的账号通常是具备以下的几种特征 ①利他性&#xff1a;利他性的核心在于你向用户提供了什么&#xff1f; 可以透过逆向思维来体现&#xff0c;首先要明确目标人群及其需求&#xff0c;然后根据这些需求提供必要的…

JetsonNano —— 3、在Nano板卡编译可硬件加速FFmpeg,测试FFmpeg调用nvmpi编解码器加速

最终FFmpeg运行加速效果如下: FFmpeg 简介 一个完整的跨平台解决方案,用于录制、转换和流式传输音频和视频。   JetsonNano 简介 NVIDIA Jetson Nano为数百万台高性能、低功耗设备提供前所未有的功能。这项技术创新为网络录像机、机器人或具有高级分析功能的智能家居网关等…