MySQL--复合查询--0422

news2024/12/23 23:07:13

注:为了方便查看 mysql语句会有突然的换行,书写时请勿模仿。

目录

1.单表查询回顾

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

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

2.多表查询

比如需要查询雇员名字和所在部门编号及部门名字。

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

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

2.2 多表查询总结

3.自连接

显示员工ford的上级领导的编号和姓名

 4. 子查询

4.1 单行子查询

显示SMITH同一部门的员工

4.2 多行子查询

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

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

 4.3 多列子查询

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

4.4 在from子句中使用子查询

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

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

4.5 合并查询

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


1.单表查询回顾

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

可以使用如下语句吗?

select ename,max(sal) from emp;

 max(sal)是聚合函数,把整个表当做一个数据来看,但是ename不能将整个表当做一个数据,所以会出现错误。但是如果select筛选的表结构是max(sal)显示出来的表,那么就不会再有错误了。所以用过两条语句也可以达成目的。

select max(sal) from emp;

select ename,job from emp where sal=5000; -->5000就是表里面最大值

select是支持嵌套的

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

有一条select语句的结果被当做某条select的条件,这条select语句称为子查询。执行顺序类似递归。注意子查询设置的别名,在主查询中依然看不到!

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

mysql> select ename,job from emp where sal>(select avg(sal) from emp);
+-------+-----------+
| ename | job       |
+-------+-----------+
| JONES | MANAGER   |
| BLAKE | MANAGER   |
| CLARK | MANAGER   |
| SCOTT | ANALYST   |
| KING  | PRESIDENT |
| FORD  | ANALYST   |
+-------+-----------+

2.多表查询

有时仅使用一张表达不到查询效果。

比如需要查询雇员名字和所在部门编号及部门名字。

由于雇员名字在emp表中,而部门名字在dept表中,因此需要联合查询。

mysql> select * from dept,emp;

 上述语句也会生成一个表,这个表是dept和emp的笛卡尔积。

 笛卡尔积会出现很多冗余数据是没有意义的,可以使用两张表有关联的部分进行筛选。比如部门编号。

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

 这张表就是多表查询后最完整的表,然后就可以从这张表里挑需要的数据进行显示了。

mysql> select ename,emp.deptno,dname from dept,emp where dept.deptno=emp.deptno;
+--------+--------+------------+
| ename  | deptno | dname      |
+--------+--------+------------+
| SMITH  |     20 | RESEARCH   |
| ALLEN  |     30 | SALES      |
| WARD   |     30 | SALES      |
| JONES  |     20 | RESEARCH   |
| MARTIN |     30 | SALES      |
| BLAKE  |     30 | SALES      |
| CLARK  |     10 | ACCOUNTING |
| SCOTT  |     20 | RESEARCH   |
| KING   |     10 | ACCOUNTING |
| TURNER |     30 | SALES      |
| ADAMS  |     20 | RESEARCH   |
| JAMES  |     30 | SALES      |
| FORD   |     20 | RESEARCH   |
| MILLER |     10 | ACCOUNTING |
+--------+--------+------------+

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

mysql> select dname,ename,sal from emp,dept where emp.deptno=dept.deptno 
                and dept.deptno=10;
+------------+--------+---------+
| dname      | ename  | sal     |
+------------+--------+---------+
| ACCOUNTING | CLARK  | 2450.00 |
| ACCOUNTING | KING   | 5000.00 |
| ACCOUNTING | MILLER | 1300.00 |
+------------+--------+---------+

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

mysql> select ename,sal,grade from emp,salgrade where emp.sal between losal and hisal;
+--------+---------+-------+
| ename  | sal     | grade |
+--------+---------+-------+
| SMITH  |  800.00 |     1 |
| ALLEN  | 1600.00 |     3 |
| WARD   | 1250.00 |     2 |
| JONES  | 2975.00 |     4 |
| MARTIN | 1250.00 |     2 |
| BLAKE  | 2850.00 |     4 |
| CLARK  | 2450.00 |     4 |
| SCOTT  | 3000.00 |     4 |
| KING   | 5000.00 |     5 |
| TURNER | 1500.00 |     3 |
| ADAMS  | 1100.00 |     1 |
| JAMES  |  950.00 |     1 |
| FORD   | 3000.00 |     4 |
| MILLER | 1300.00 |     2 |
+--------+---------+-------+
14 rows in set (0.00 sec)

2.2 多表查询总结

多表组合,形成笛卡尔积本质上就是数据的穷举。

解决多表查询的思路:

  1. 先确定和哪些表有关系
  2. 让几张有联系的表形成笛卡尔积
  3. 在形成的笛卡尔积中添加筛选条件,将多表查询看做为一张表的查询

3.自连接

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

显示员工ford的上级领导的编号和姓名

可以发现当前语句在书写时,需要在emp表中查找名字为ford的数据而且在显示筛选条件时也是在emp表中。称为子连接。

可以使用子查询来写

mysql> select empno,ename from emp where 
                empno=(select mgr from emp where ename='FORD');
+--------+-------+
| empno  | ename |
+--------+-------+
| 007566 | JONES |
+--------+-------+

也可以使用多表查询

 同一张表不能直接查询两次,但是如果将该表起别名,就可以拼起来了。

mysql> select leader.empno,leader.ename from emp leader,emp worker 
            where worker.mgr=leader.empno and worker.ename='ford';
+--------+-------+
| empno  | ename |
+--------+-------+
| 007566 | JONES |
+--------+-------+

 4. 子查询

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

4.1 单行子查询

显示SMITH同一部门的员工

mysql> select ename,deptno from emp where deptno=(select deptno from emp where ename='smith');
+-------+--------+
| ename | deptno |
+-------+--------+
| SMITH |     20 |
| JONES |     20 |
| SCOTT |     20 |
| ADAMS |     20 |
| FORD  |     20 |
+-------+--------+

4.2 多行子查询

in

in (...)

在(...)范围中

all

all(...)

比(...)范围内都

any

any(...)

比(...)范围内任意一个

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

mysql> select * from emp where job in
        (select distinct job from emp where deptno=10) and deptno!=10;
+--------+-------+---------+------+---------------------+---------+------+--------+
| empno  | ename | job     | mgr  | hiredate            | sal     | comm | deptno |
+--------+-------+---------+------+---------------------+---------+------+--------+
| 007566 | JONES | MANAGER | 7839 | 1981-04-02 00:00:00 | 2975.00 | NULL |     20 |
| 007698 | BLAKE | MANAGER | 7839 | 1981-05-01 00:00:00 | 2850.00 | NULL |     30 |
| 007369 | SMITH | CLERK   | 7902 | 1980-12-17 00:00:00 |  800.00 | NULL |     20 |
| 007876 | ADAMS | CLERK   | 7788 | 1987-05-23 00:00:00 | 1100.00 | NULL |     20 |
| 007900 | JAMES | CLERK   | 7698 | 1981-12-03 00:00:00 |  950.00 | NULL |     30 |
+--------+-------+---------+------+---------------------+---------+------+--------+

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

mysql> select ename,sal,deptno from emp where 
            sal>all(select sal from emp where deptno=30);
+-------+---------+--------+
| ename | sal     | deptno |
+-------+---------+--------+
| JONES | 2975.00 |     20 |
| SCOTT | 3000.00 |     20 |
| KING  | 5000.00 |     10 |
| FORD  | 3000.00 |     20 |
+-------+---------+--------+

 4.3 多列子查询

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

mysql> select * from emp where (deptno,job)=
            (select deptno,job from emp where ename='smith');
+--------+-------+-------+------+---------------------+---------+------+--------+
| empno  | ename | job   | mgr  | hiredate            | sal     | comm | deptno |
+--------+-------+-------+------+---------------------+---------+------+--------+
| 007369 | SMITH | CLERK | 7902 | 1980-12-17 00:00:00 |  800.00 | NULL |     20 |
| 007876 | ADAMS | CLERK | 7788 | 1987-05-23 00:00:00 | 1100.00 | NULL |     20 |
+--------+-------+-------+------+---------------------+---------+------+--------+


mysql> select * from emp where (deptno,job)=
            (select deptno,job from emp where ename='smith') and ename!='smith';
+--------+-------+-------+------+---------------------+---------+------+--------+
| empno  | ename | job   | mgr  | hiredate            | sal     | comm | deptno |
+--------+-------+-------+------+---------------------+---------+------+--------+
| 007876 | ADAMS | CLERK | 7788 | 1987-05-23 00:00:00 | 1100.00 | NULL |     20 |
+--------+-------+-------+------+---------------------+---------+------+--------+

4.4 在from子句中使用子查询

本质上还是多表查询,无非是把select的结果当做一个临时的表和其他表拼起来。

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

(1)先求一下每个部门的平均工资

mysql> select avg(sal), deptno from emp group by deptno;
+-------------+--------+
| avg(sal)    | deptno |
+-------------+--------+
| 2916.666667 |     10 |
| 2175.000000 |     20 |
| 1566.666667 |     30 |

(2)把平均工资表和emp表拼起来,形成笛卡尔积,然后进行条件筛选。

mysql> select * from emp,
        (select avg(sal) avgsal, deptno dt from emp group by deptno) tmp 
            where emp.deptno=tmp.dt;
+--------+--------+-----------+------+---------------------+---------+---------+--------+-------------+------+
| empno  | ename  | job       | mgr  | hiredate            | sal     | comm    | deptno | avgsal      | dt   |
+--------+--------+-----------+------+---------------------+---------+---------+--------+-------------+------+
| 007369 | SMITH  | CLERK     | 7902 | 1980-12-17 00:00:00 |  800.00 |    NULL |     20 | 2175.000000 |   20 |
| 007499 | ALLEN  | SALESMAN  | 7698 | 1981-02-20 00:00:00 | 1600.00 |  300.00 |     30 | 1566.666667 |   30 |
| 007521 | WARD   | SALESMAN  | 7698 | 1981-02-22 00:00:00 | 1250.00 |  500.00 |     30 | 1566.666667 |   30 |
| 007566 | JONES  | MANAGER   | 7839 | 1981-04-02 00:00:00 | 2975.00 |    NULL |     20 | 2175.000000 |   20 |
| 007654 | MARTIN | SALESMAN  | 7698 | 1981-09-28 00:00:00 | 1250.00 | 1400.00 |     30 | 1566.666667 |   30 |
| 007698 | BLAKE  | MANAGER   | 7839 | 1981-05-01 00:00:00 | 2850.00 |    NULL |     30 | 1566.666667 |   30 |
| 007782 | CLARK  | MANAGER   | 7839 | 1981-06-09 00:00:00 | 2450.00 |    NULL |     10 | 2916.666667 |   10 |
| 007788 | SCOTT  | ANALYST   | 7566 | 1987-04-19 00:00:00 | 3000.00 |    NULL |     20 | 2175.000000 |   20 |
| 007839 | KING   | PRESIDENT | NULL | 1981-11-17 00:00:00 | 5000.00 |    NULL |     10 | 2916.666667 |   10 |
| 007844 | TURNER | SALESMAN  | 7698 | 1981-09-08 00:00:00 | 1500.00 |    0.00 |     30 | 1566.666667 |   30 |
| 007876 | ADAMS  | CLERK     | 7788 | 1987-05-23 00:00:00 | 1100.00 |    NULL |     20 | 2175.000000 |   20 |
| 007900 | JAMES  | CLERK     | 7698 | 1981-12-03 00:00:00 |  950.00 |    NULL |     30 | 1566.666667 |   30 |
| 007902 | FORD   | ANALYST   | 7566 | 1981-12-03 00:00:00 | 3000.00 |    NULL |     20 | 2175.000000 |   20 |
| 007934 | MILLER | CLERK     | 7782 | 1982-01-23 00:00:00 | 1300.00 |    NULL |     10 | 2916.666667 |   10 |
+--------+--------+-----------+------+---------------------+---------+---------+--------+-------------+------+

(3)进行筛选

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

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

(1)先筛出来最高工资

mysql> select max(sal) maxsal,deptno from emp group by deptno;
+---------+--------+
| maxsal  | deptno |
+---------+--------+
| 5000.00 |     10 |
| 3000.00 |     20 |
| 2850.00 |     30 |
+---------+--------+

 (2) 将最高工资表和emp表拼起来

mysql> select* from emp,(select max(sal) maxsal,deptno 
            from emp group by deptno) tmp 
                where emp.deptno=tmp.deptno;

(3)加上限制条件和需要显示的信息列

mysql> select ename,emp.deptno,sal,maxsal from emp,
            (select max(sal) maxsal,deptno from emp group by deptno) tmp 
                    where emp.deptno=tmp.deptno and emp.sal=maxsal;
+-------+--------+---------+---------+
| ename | deptno | sal     | maxsal  |
+-------+--------+---------+---------+
| BLAKE |     30 | 2850.00 | 2850.00 |
| SCOTT |     20 | 3000.00 | 3000.00 |
| KING  |     10 | 5000.00 | 5000.00 |
| FORD  |     20 | 3000.00 | 3000.00 |
+-------+--------+---------+---------+

 

4.5 合并查询

为了合并多个select的执行结果,可以使用集合操作符 union(自带去重),union all(不去重)

union的两个表的结构必须相同,否则union出来的结果无意义。

mysql> select ename,sal from emp where sal>2500 
        union select sal,job from emp where job='manager';
+---------+---------+
| ename   | sal     |
+---------+---------+
| JONES   | 2975.00 |
| BLAKE   | 2850.00 |
| SCOTT   | 3000.00 |
| KING    | 5000.00 |
| FORD    | 3000.00 |
| 2975.00 | MANAGER |
| 2850.00 | MANAGER |
| 2450.00 | MANAGER |
+---------+---------+

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

mysql> select ename,sal,job from emp where sal>2500 
        union select ename,sal,job from emp where job='manager';
+-------+---------+-----------+
| ename | sal     | job       |
+-------+---------+-----------+
| JONES | 2975.00 | MANAGER   |
| BLAKE | 2850.00 | MANAGER   |
| SCOTT | 3000.00 | ANALYST   |
| KING  | 5000.00 | PRESIDENT |
| FORD  | 3000.00 | ANALYST   |
| CLARK | 2450.00 | MANAGER   |
+-------+---------+-----------+

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

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

相关文章

“智慧赋能 强链塑链”——精细化工行业仓储物流数字化转型探讨

精细化工行业作为衡量国家化学工业水平高低的重要标志,为国民经济提供重要的终端产品支持,相比较大化工产品,精细化工产品需要高度专业技能和工艺,其生产过程需要复杂的化学反应,以及严格的控制条件,产出的…

基于 TiDB + Flink 实现的滑动窗口实时累计指标算法

作者:李文杰 前言 在不少的支付分析场景里,大部分累计值指标可以通过 Tn 的方式计算得到 。随着行业大环境由增量市场转为存量市场,产品的运营要求更加精细化、更快速反应,这对各项数据指标的实时性要求已经越来越高。产品如果能…

UDS-19服务的状态掩码字节解析

19服务读DTC信息有01、02、04、06、0A等子服务,使用诊断仪读取DUT数据一般只需发送4字节有效数据,其他无效字节用00或者CC填充,如03 19 02 09 00 00 00 00, 数据分解: 03:表示报文类型未单帧,长…

考研计算机组成原理总结(8)

一.计算机工作过程 计算机工作的过程,即一条条指令工作的过程: 取指令: 1.(PC)—>MAR,把PC存放的指令存储地址传送给MAR3.M(MAR)—>MDR,主存根据地址取出指令存放到MDR中4.(MDR)—>IR,指令从MD…

[golang gin框架] 28.Gin 发送短信,DES加密解,Cookie加密,解密操作

一.发送短信 1.简介 在用户注册的时候,需要发送短信来校验用户以及手机号,达到用户注册的目的,一般有很多短信接口来达到发送短信的操作,比如:云片短信服务,阿里云短信服务, 腾讯云短信服务等等,这里以腾讯云短信服务来发送短信: 腾讯云短信服务相关网址: 短信介绍 发送短信AP…

【计算机视觉 | 目标检测】Grounding DINO:开集目标检测论文解读

介绍一篇较新的目标检测工作: Grounding DINO: Marrying DINO with Grounded Pre-Training for Open-Set Object Detection论文地址为: https://arxiv.org/pdf/2303.05499.pdfgithub 地址为: https://github.com/IDEA-Research/GroundingD…

flask框架之----Flask-Mail邮件

介绍: Web应用程序经常需要向用户、客户端、管理员、运维人员等相关人员发送邮件。在Flask框架中提供了Flask-Mail邮件库来管理电子邮件的收发。 安装:flask-mail: pip3 install flask-mail配置: 服务器信息: Flask-Mail &…

ESP32学习笔记 -- ESP32-S3使用NVS存储数据

什么是NVS? 非易失性存储(Non-Volatile Storage)简称NVS,是用来保存一些设备断电后不能丢失的数据,乐鑫的ESP32-S3芯片使用了一套NVS库函数对外置的SPI FLASH进行读、写、擦除等操作。 ESP-IDF通过分区表的方式,在外部SPI FLASH里面开辟一段存储空间(也称作NVS分区),…

Vue3 基础语法

文章目录 1.创建Vue项目1.1创建项目1.2 初始项目 2.vue3 语法2.1 复杂写法2.2 简易写法2.3 reactive(对象类型)2.4 ref(简单类型)2.5 computed(计算属性)2.6 watch(监听) 3.vue3 生命周期4.vue3 组件通信4.…

程序员应该怎么自学才能入门 ?我来聊聊自己的经历

当你想成为一名程序员,如何自学入门是一个非常重要的问题。在这里我分享一下我的经验,希望能对你有所帮助。 首先,为了制定好你的学习路线,你可以在网上的培训机构网站找到一张基础路线图。这张路线图必须是跟行业对标的&#xf…

Leetcode 42 接雨水

Leetcode42接雨水 题解1:正反两扫(Simple and effect)题解2:DP题解3:单调栈(单调栈存储的是下标,满足从栈底到栈顶的下标对应height的元素呈递减)题解4:双指针&#xff0…

【CSS系列】第六章 · CSS列表、表格、背景、鼠标属性

写在前面 Hello大家好, 我是【麟-小白】,一位软件工程专业的学生,喜好计算机知识。希望大家能够一起学习进步呀!本人是一名在读大学生,专业水平有限,如发现错误或不足之处,请多多指正&#xff0…

【数据结构】- 链表之带头(哨兵位)双向循环链表(上)

文章目录 前言🌟一、带头双向循环链表🌟二、带头双向循环链表结构图:🌟三、带头双向循环链表代码实现:🌏3.1头插:🌏3.2头插流程图🌏3.3 尾插🌏3.4尾插流程图&…

【CSS系列】第三章 · CSS三大特性和颜色的表示

写在前面 Hello大家好, 我是【麟-小白】,一位软件工程专业的学生,喜好计算机知识。希望大家能够一起学习进步呀!本人是一名在读大学生,专业水平有限,如发现错误或不足之处,请多多指正&#xff0…

Swagger简单了解

Swagger 介绍 使用swagger你只需要按照它的规范去定义接口及接口相关信息,在通过swagger衍生出来的一系列项目和工具,就可以做到生成各种格式的接口文档,以及在线接口调试页面等等。 官网:https://swagger.io/ knife4j是为javaMVC…

Linux网络——Shell编程之函数

Linux网络——Shell编程之函数 一、概述二、定义函数的格式1.格式一2.格式二 三、函数的查看和删除1.查看 declare2.删除 declare 四、函数的返回值1.return 返回值2.echo 返回值 五、函数的参数传入与变量范围1.函数的传参2.函数变量的作用范围 六、函数的应用1.阶乘2.递归目录…

知识不断分叉,知怎么来,才知怎么去

知识不断分叉,知怎么来,才知怎么去 定位方法论在中国的演化和继承 趣讲大白话:知道什么来,方知怎么去 【趣讲信息科技159期】 **************************** 定位也谈不上是科学意义上的理论 而是商业实践方法 不能神话 但也要有基…

深入了解目标检测技术--从基本概念到算法入门

前言: Hello大家好,我是Dream。 众所周知,目标检测是计算机视觉领域中的重要任务之一,其目的是识别图像或视频中包含的物体实例并将其定位。实现目标检测可以帮助人们在自动驾驶、机器人导航、安防监控等领域中更好地理解和应用图…

K_A37_002 基于STC89C52RC驱动PCF8591模块 串口与OLED0.96双显示

K_A37_002 基于STC89C52RC驱动PCF8591模块 串口与OLED0.96双显示 所有资源导航一、资源说明二、基本参数参数引脚说明 三、驱动说明IIC地址/采集通道选择/时序对应程序: 四、部分代码说明1、接线引脚定义1.1、STC89C52RCPCF8591模块 五、基础知识学习与相关资料下载六、视频效果…

JavaScript的基础语法

目录 一、初识JavaScript(简称JS) 1.JavaScript 运行过程 2.JavaScript 的组成 二、JavaScript的规范与调试 1.JavaScript 的书写形式 1.1 行内式 1.2 内嵌式(建议写在之前) 1.3 外部式(建议写在之前&#xf…