MySQL复合查询

文章目录

  • MySQL复合查询
    • 1. 基本查询回顾
      • (1) 查询工资高于500或岗位为MANAGER的雇员,同时还要满足他们的姓名首字母为大写的J
      • (2) 按照部门号升序而雇员的工资降序排序
      • (3) 使用年薪进行降序排序
      • (4) 显示工资最高的员工的名字和工作岗位
      • (5) 显示工资高于平均工资的员工信息
      • (6) 显示每个部门的平均工资和最高工资
      • (7) 显示平均工资低于2000的部门号和它的平均工资
      • (8) 显示每种岗位的雇员总数,平均工资
    • 2. 多表查询
      • (1) 笛卡尔积
      • (2) 显示雇员名、雇员工资以及所在部门的名字
      • (3) 显示部门号为10的部门名,员工名和工资
      • (4) 显示各个员工的姓名,工资,及工资级别
    • 3. 自连接
      • (1) 显示员工FORD的上级领导的编号和姓名
    • 4. 子查询
      • 4.1 在where子句中充当判断条件
        • 4.1.1 单行子查询
          • (1) 显示SMITH同一部门的员工
        • 4.1.2 多行子查询
          • (1) 查询和10号部门的工作岗位相同的雇员的名字,岗位,工资,部门号,但是不包含10自己的
          • (2) 查询和10号部门的工作岗位相同的雇员的名字,岗位,工资,部门号,所在的部门名称,但是不包含10自己的
          • (3) 显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号
          • (4) 显示工资比部门30的任意员工的工资高的员工的姓名、工资和部门号(包含自己部门的员工)
        • 4.1.3 多列子查询
          • (1) 查询和SMITH的部门和岗位完全相同的所有雇员,不含SMITH本人
      • 4.2 在from子句中使用子查询
        • (1) 显示每个高于自己部门平均工资的员工的姓名、部门、工资、平均工资
        • (2) 显示每个高于自己部门平均工资的员工的姓名、工作地点、部门
        • (3) 查找每个部门工资最高的人的姓名、工资、部门、最高工资
        • (4) 显示每个部门的信息(部门名,编号,地址)和人员数量
    • 5. 合并查询
      • 5.1 union
        • (1) 将工资大于2500或职位是MANAGER的人找出来
      • 5.2 union all
        • (1) 将工资大于25000或职位是MANAGER的人找出来

MySQL复合查询

1. 基本查询回顾

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

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

在这里插入图片描述

也可以使用内置函数来查询首字母为大写的J

mysql> select * from emp where (sal > 500 or job = 'MANAGER') and -> substring(ename, 1, 1) = 'J';

在这里插入图片描述

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

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

在这里插入图片描述

(3) 使用年薪进行降序排序

年薪 = 月薪(sal) * 12 + 奖金(comm)

  • 这里有的comm为NULL,NULL与任何值做计算得到的结果都是NULL,所以若是直接用NULL来计算得到结果还是NULL。
  • comm的运算可以使用ifnull函数来comm判断是否为NULL,若不为NULL则ifnull函数返回员工的comm,如果为NULL则ifnull函数返回0,避免让NULL值参与计算

直接用comm的NULL参与运算

在这里插入图片描述

正确写法:

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

在这里插入图片描述

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

解决该问题有两种方案:

  1. 使用两次查询
  2. 使用一次子查询(推荐)

两次查询

mysql> select max(sal) from emp;
mysql> select ename, job from emp where sal = '5000';

在这里插入图片描述

一次子查询,将两条查询语句合并起来,where条件筛选中再使用select进行筛选,此语句执行的顺序是由内向外,先执行where中的select,再执行整句中的select

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

在这里插入图片描述

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

同样使用子查询

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

在这里插入图片描述

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

在group by子句中指明按照部门号进行分组,在select语句中使用avg函数和max函数,分别查询每个部门的平均工资和最高工资

mysql> select deptno, format(avg(sal),2),  max(sal) from emp group by deptno;

在这里插入图片描述

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

在group by子句中指明按照部门号进行分组,在select语句中使用avg函数查询每个部门的平均工资,在having子句中指明筛选条件为平均工资小于2000

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

在这里插入图片描述

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

mysql> select job, count(*), format(avg(sal),2) from emp group by job;

在这里插入图片描述

2. 多表查询

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

(1) 笛卡尔积

员工表:

在这里插入图片描述

部门表:

在这里插入图片描述

我们想让两个表联合显示为一张表

mysql> select * from emp, dept;

在这里插入图片描述

我们会发现上面的表是这样显示的

整张表由两个表构成,前半部分是员工表的列信息,后半部分是部门表的列信息。

在这里插入图片描述

同时员工表中每条记录与部门表进行穷举组合,员工表中的每一个员工信息都会和部门表中的每一个部门信息进行组合。

在这里插入图片描述

  • 我们这种从第一张表中选取一条记录与第二张表中的所有记录进行穷举组合且不加过滤条件,得到的结果称为笛卡尔积。

  • 但是在实际开发中,一个员工只有和自己所在的部门信息进行组合才是有意义的,因此需要我们在笛卡尔积产生的新表中筛选出真正需要的数据

(2) 显示雇员名、雇员工资以及所在部门的名字

笛卡尔积的表中可能会存在相同的列名,这时在选中列名时需要通过表名.列名的方式进行指明,若有重复的不指明确切的一列,就会报错

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

在这里插入图片描述

(3) 显示部门号为10的部门名,员工名和工资

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

在这里插入图片描述

(4) 显示各个员工的姓名,工资,及工资级别

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

在这里插入图片描述

3. 自连接

自连接是指在同一张表连接查询,即我们可以对同一张表取笛卡尔积

(1) 显示员工FORD的上级领导的编号和姓名

可以分为2步:

  1. 先找到FORD的领导的编号
  2. 根据领导的编号,找领导信息

这2步合并为1步使用子查询

  • 使用子查询
mysql> select empno, ename from emp where empno = (select mgr from emp where ename =          'FORD');

在这里插入图片描述

  • 使用多表查询(自查询)

对同一张表做笛卡尔积要给自己的表起别名

mysql> select * from emp e1, emp e2;

图只放了一部分
在这里插入图片描述

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

在这里插入图片描述

4. 子查询

子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询

4.1 在where子句中充当判断条件

4.1.1 单行子查询

返回一行记录的子查询

(1) 显示SMITH同一部门的员工

在子查询中查询SMITH所在的部门号,在where子句中指明筛选条件为员工部门号等于子查询返回的部门号

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

在这里插入图片描述

4.1.2 多行子查询

返回多行记录的子查询

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

in关键字: 判断某个对应列值是否在集合当中

可以先查询10号部门有哪些岗位,查询时要对结果进行去重,因为10号部门的某些员工的工作岗位可能是相同的

在这里插入图片描述

再将上述查询作为子查询,在查询员工表时在where子句中使用in关键字,判断员工的工作岗位是子查询得到的若干岗位中的一个

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

在这里插入图片描述

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

拿着查询出来的表结构和其他查询结果做笛卡尔积

mysql> select ename, job,sal,dname from(select ename,job,sal, deptno from emp where job in(select distinct job from emp where deptno = 10) and deptno<>100) as tmp, dept where dept.deptno=tmp.deptno;

在这里插入图片描述

(3) 显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号

all关键字

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

在这里插入图片描述

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

any关键字

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

在这里插入图片描述

4.1.3 多列子查询

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

(1) 查询和SMITH的部门和岗位完全相同的所有雇员,不含SMITH本人
mysql> select * from emp where (deptno, job) = (select deptno, job from emp where ename ='SMITH') and ename<>'SMITH';#这里也可以把=改成in
mysql> select * from emp where (deptno, job) in (select deptno, job from emp where ename ='SMITH') and ename<>'SMITH';

在这里插入图片描述

  • 上面除(2)外所有的子查询,全部在where子句中,充当判断条件

  • 任何时候,查询出来的临时结构,本质在逻辑上也是表结构,即MySQL中一切皆表

4.2 在from子句中使用子查询

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

多表查询的指导思想

解决多表问题的本质:想办法将多表转化成单表,所以MySQL中,所有select的问题全部都可以转成单表问题

(1) 显示每个高于自己部门平均工资的员工的姓名、部门、工资、平均工资

# 显示每个部门的平均工资,将其看作临时表
mysql> select deptno, avg(sal) mysal from emp group by deptno;# 多表查询
mysql> select * from emp, (select deptno, avg(sal) mysal from emp group by deptno) tmp      -> where sal > tmp.mysal and emp.deptno=tmp.deptno;# 单表查询
mysql> select ename,emp.deptno,sal,mysal from emp, (select deptno, avg(sal) mysal from emp group by deptno) tmp where sal > tmp.mysal and emp.deptno=tmp.deptno;

在这里插入图片描述

(2) 显示每个高于自己部门平均工资的员工的姓名、工作地点、部门

mysql> select * from dept;# 多表查询
mysql> select * from dept, (select ename,emp.deptno,sal,mysal from emp, (select deptno,      -> avg(sal) mysal from emp group by deptno) tmp where sal > tmp.mysal and                 -> emp.deptno=tmp.deptno) t1;mysql> select * from dept, (select ename,emp.deptno,sal,mysal from emp, (select deptno,      -> avg(sal) mysal from emp group by deptno) tmp where sal > tmp.mysal and                -> emp.deptno=tmp.deptno) t1 where t1.deptno=dept.deptno;# 单表查询
mysql> select t1.ename,dept.loc,t1.deptno from dept, (select ename,emp.deptno,sal,mysal       -> from emp, (select deptno, avg(sal) mysal from emp group by deptnoo) tmp where sal    -> > tmp.mysal and emp.deptno=tmp.deptno) t1 where t1.deptno=dept.deptno;

在这里插入图片描述

(3) 查找每个部门工资最高的人的姓名、工资、部门、最高工资

# 每个部门的最高工资
mysql> select deptno, max(sal) from emp group by deptno;# 多表查询
mysql> select * from emp e1, (select deptno, max(sal) from emp group by deptno) e2;mysql> select * from emp e1, (select deptno, max(sal) mysal from emp group by deptno) e2 where e1.deptno=e2.deptno and e1.sal=e2.mysal;# 单表查询
mysql> select ename, sal, e1.deptno, mysal from emp e1, (select deptno, max(sal) mysal      -> from emp group by deptno) e2 where e1.deptno=e2.deptno and e1.sal=e2.mysal;

在这里插入图片描述

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

  • 使用子查询多表
# 每个部门的人数
mysql> select deptno, count(*) dept_num from emp group by deptno;# 多表查询
mysql> select * from dept t1, (select deptno, count(*) dept_num from emp group by deptno)    -> t2 where t1.deptno=t2.deptno;# 单表查询
mysql> select dname,t1.deptno,loc, dept_num from dept t1, (select deptno, count(*)           -> dept_num from emp group by deptno) t2 where t1.deptno=t2.deptno;

在这里插入图片描述

5. 合并查询

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

5.1 union

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

(1) 将工资大于2500或职位是MANAGER的人找出来

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

在这里插入图片描述

5.2 union all

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

(1) 将工资大于25000或职位是MANAGER的人找出来

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

在这里插入图片描述

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

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

相关文章

无涯教程-Android Online Test函数

Android在线测试模拟了真正的在线认证考试。您将看到基于 Android概念的多项选择题(MCQ),将为您提供四个options。您将为该问题选择最合适的答案,然后继续进行下一个问题,而不会浪费时间。完成完整的考试后,您将获得在线考试分数。 总问题数-20 最长时间-20分钟 Start Test …

Configuring HSRP(Hot Standby Routing Protocol)

网络冗余架构设计中&#xff0c;必不可少的就是网关冗余功能&#xff0c;而很多核心网中都会用到HSRP(Hot Standby Routing Protocol)协议来实现这个功能。 热备份路由协议&#xff08;HSRP&#xff09; 热备份路由协议&#xff08;HSRP&#xff09;是思科公司专有的协议&…

实现不同局域网间的文件共享和端口映射,使用Python自带的HTTP服务

文章目录 1. 前言2. 本地文件服务器搭建2.1 python的安装和设置2.2 cpolar的安装和注册 3. 本地文件服务器的发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 数据共享作为和连接作为互联网的基础应用&#xff0c;不仅在商业和办公场景有广泛的应用…

【Nacos】使用Nacos进行服务发现、配置管理

Nacos Nacos是 Dynamic Naming and Configuration Service 的首字母简称&#xff0c;一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 版本说明&#xff1a;版本说明 alibaba/spring-cloud-alibaba Wiki GitHub <properties><java.version>…

unity3d:功能验证,收集开源项目的工程合集

unity3d功能验证&#xff0c;和收集开源项目的工程合集 目录持续更新地址 【腾讯文档】UnityForTest目录 https://docs.qq.com/doc/DWm9HSkVhTGdyUUVo 源码 https://github.com/luoyikun/UnityForTest 动画 创建骨骼动画 BoneAnimation场景 代码创建Mesh&#xff0c;骨骼…

Flask项目请求图片资源返回403错误

问题 解决 在图片url前缀前加 "https://images.weserv.nl/?url" 参考 如何解决访问外部图片返回 403 Forbidden 错误 - 知乎 vue中请求接口会自动带上本地ip_vite打包后请求地址为什么带本地地址_夜月晓晓的博客-CSDN博客

CSS判断手机暗黑模式

手机有个功能到了晚上会自动变成深色也就是暗黑模式.这种情况下网页会自动变颜色.如果想自由控制暗黑模式下的html样式的话,可以用如下方式: media (prefers-color-scheme: dark) {/*html, body {*//*filter: invert(1) hue-rotate(180deg);*//*}*/.maill{margin-left: 0;marg…

【ES系列】(一)简介与安装

首发博客地址 首发博客地址[1] 系列文章地址[2] 教学视频[3] 为什么要学习 ES? 强大的全文搜索和检索功能&#xff1a;Elasticsearch 是一个开源的分布式搜索和分析引擎&#xff0c;使用倒排索引和分布式计算等技术&#xff0c;提供了强大的全文搜索和检索功能。学习 ES 可以掌…

【FreeRTOS】互斥量的使用与逐步实现

在FreeRTOS中&#xff0c;互斥量是一种用于保护共享资源的同步机制。它通过二进制信号量的方式&#xff0c;确保在任意时刻只有一个任务可以获取互斥量并访问共享资源&#xff0c;其他任务将被阻塞。使用互斥量的基本步骤包括创建互斥量、获取互斥量、访问共享资源和释放互斥量…

【Vue3 知识第二讲】Vue3新特性、vue-devtools 调试工具、脚手架搭建

文章目录 一、Vue3 新特性1.1 重写双向数据绑定1.1.1 Vue2 基于Object.defineProperty() 实现1.1.2 Vue3 基于Proxy 实现 1.2 优化 虚拟DOM1.3 Fragments1.4 Tree shaking1.5 Composition API 二、 vue-devtools 调试工具三、环境配置四、脚手架目录介绍五、SFC 语法规范解析附…

Android Studio 的github 工程克隆

上文介绍了Android Studio 里的"Git 建立和简单操作。本文介绍从github 上的工程fork 和clone到本地&#xff0c;然后学习和改进。 本文参考 https://learntodroid.com/how-to-use-git-and-github-in-android-studio/ 克隆clone Github 仓库&#xff1a; 先 Fork 你选择…

实战黑马苍穹外卖项目8.1-10.1

文章目录 软件开发的基本流程用户层网关层应用层数据层工具 数据库设计导入准备好的前端和后端工程基础工程代码分析完成员工功能完成菜品功能入门Redis实现店铺营业HttpClient微信小程序开发缓存Spring Cache实现地址功能用户下单实现订单推送状态apache对应的工具使用项目用到…

无涯教程-Flutter - 数据库

SQLite" class"css-1occaib">SQLite数据库是基于事实和标准SQL的嵌入式数据库引擎&#xff0c;它是小型且经过时间考验的数据库引擎&#xff0c;sqflite软件包提供了许多函数&#xff0c;可以有效地与SQLite数据库一起使用&#xff0c;它提供了操作SQLite数据…

ExpressLRS开源代码之框架结构

ExpressLRS开源代码之框架结构 1. 源由2. Arduino应用框架3. ExpressLRS应用框架4. 硬件设计框架4.1 单天线4.2 双天线单PA4.3 双天线双PA 5. 应用软件设计6. 参考资料 1. 源由 最近为了理解《ExpressLRS开源之基本调试数据含义》&#xff0c;做了一些源代码的研读。 概念、文…

基于costas环的载波同步系统matlab性能仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ............................................................................ I_Dataroun…

kubernetes进阶 (一) 环境搭建

我是基于一台centos7.6的腾讯云主机进行操作的&#xff0c;配置为4C8G&#xff0c;之前的文档自己试着搭建发现有问题了&#xff0c;这里重新整理下笔记&#xff0c;集群版本选择1.22.2&#xff08;一年前搭的&#xff09;用的还不错 清理环境 之前我的环境可能装过docker或者什…

Ansible学习笔记4

file模块&#xff1a; file模块用于对文件相关的操作&#xff08;创建、删除、属性修改、软链接等&#xff09;touch是创建。 [rootlocalhost ~]# ansible group1 -m file -a "path/tmp/111 statetouch" 192.168.17.105 | CHANGED > {"ansible_facts"…

[SpringBoot3]视图技术Thymeleaf

七、视图技术Thymeleaf Thymeleaf是一个表现层的模板引擎&#xff0c;一般被使用在Web环境中&#xff0c;它可以处理HTML、XML、JS等文档&#xff0c;简单来说&#xff0c;它可以将JSP作为Java Web应用的表现层&#xff0c;有能力展示与处理数据。这样&#xff0c;同一个模板文…

1. 安装Zookeeper

​ 1.下载 点击下载Zookeeper 单机版安装 安装Zookeeper前需要先安装jdk上传安装包rz解压安装包:tar -zxvf apache-zookeeper-3.6.0-bin.tar.gz -C /opt/app/zookeeper zookeeper目录结构:a. bin: 放置运行脚本和工具脚本b. conf: zookeeper 默认读取配置的目录,里面会有…

docker安装gitlab

安装gitlab sudo docker run --detach \--hostname gitlab \--publish 543:443 --publish 90:80 --publish 222:22 \ --name gitlab \--restart always \--volume $GITLAB_HOME/config:/etc/gitlab \--volume $GITLAB_HOME/logs:/var/log/gitlab \--volume $GITLAB_HOME/data:…