MySQL -- 复合查询

news2025/3/22 18:19:18

数据库的查询是数据库使用中比较重要的环节,前面的基础查询比较简单,不做介绍,可自行查阅。本文主要介绍复合查询,并结合用例进行讲解。

本文的用例依据Soctt模式的经典测试表,可以自行下载,也可以自己创建
链接:点这里跳转
自行创建步骤如下:

0、预备工作

0.1 建表

-- 创建 dept 表(部门表)
CREATE TABLE dept (
    deptno INT PRIMARY KEY,  -- 部门编号
    dname VARCHAR(14),       -- 部门名称
    loc VARCHAR(13)          -- 部门位置
);

-- 创建 emp 表(员工表)
CREATE TABLE emp (
    empno INT PRIMARY KEY,   -- 员工编号
    ename VARCHAR(10),       -- 员工姓名
    job VARCHAR(9),          -- 职位
    mgr INT,                 -- 上级经理编号
    hiredate DATE,           -- 入职日期
    sal DECIMAL(7,2),        -- 工资
    comm DECIMAL(7,2),       -- 奖金
    deptno INT,              -- 部门编号
    FOREIGN KEY (deptno) REFERENCES dept(deptno)
);

-- 创建 salgrade 表(工资等级表)
CREATE TABLE salgrade (
    grade INT PRIMARY KEY,   -- 工资等级
    losal DECIMAL(7,2),      -- 最低工资
    hisal DECIMAL(7,2)       -- 最高工资
);

0.2 插入测试数据

-- 插入 dept 表数据
INSERT INTO dept (deptno, dname, loc) VALUES
(10, 'ACCOUNTING', 'NEW YORK'),
(20, 'RESEARCH', 'DALLAS'),
(30, 'SALES', 'CHICAGO'),
(40, 'OPERATIONS', 'BOSTON');

-- 插入 emp 表数据
INSERT INTO emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) VALUES
(7369, 'SMITH', 'CLERK', 7902, '1980-12-17', 800.00, NULL, 20),
(7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 1600.00, 300.00, 30),
(7521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1250.00, 500.00, 30),
(7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 2975.00, NULL, 20),
(7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250.00, 1400.00, 30),
(7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01', 2850.00, NULL, 30),
(7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2450.00, NULL, 10),
(7788, 'SCOTT', 'ANALYST', 7566, '1982-12-09', 3000.00, NULL, 20),
(7839, 'KING', 'PRESIDENT', NULL, '1981-11-17', 5000.00, NULL, 10),
(7844, 'TURNER', 'SALESMAN', 7698, '1981-09-08', 1500.00, 0.00, 30),
(7876, 'ADAMS', 'CLERK', 7788, '1983-01-12', 1100.00, NULL, 20),
(7900, 'JAMES', 'CLERK', 7698, '1981-12-03', 950.00, NULL, 30),
(7902, 'FORD', 'ANALYST', 7566, '1981-12-03', 3000.00, NULL, 20),
(7934, 'MILLER', 'CLERK', 7782, '1982-01-23', 1300.00, NULL, 10);

-- 插入 salgrade 表数据
INSERT INTO salgrade (grade, losal, hisal) VALUES
(1, 700, 1200),
(2, 1201, 1400),
(3, 1401, 2000),
(4, 2001, 3000),
(5, 3001, 9999);

创建好以后,如果表的内容和下图一样,那基本就没问题了

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1、复合表的查询

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

根据上述的要求,我们可以发现,要查询的表总共两个条件,工资高于500 或 岗位为MANAGER, 首字母为J。 根据上述的两个条件,我们可以写出对应的sql查询语句: select name, job , sal from emp where (sal >= 500 or job = 'MANAGER') and enum like 'J%'; 这两个条件可以看成是并列条条件

在这里插入图片描述

2.按照部门号升序而雇员工资降序的顺序对表的内容排序

先观察一下这里的需求,首先就是要部门号升序,然后就是雇员的工资降序,所以这个案例的需求非常简单。根据这个要求我们可以写出sql查询语句:select deptno , sal from emp order by deptno asc , sal desc;

在这里插入图片描述

3. 使用年薪进行降序排序
这里我们需要特别注意的一个点就是年薪这个概念,年薪在这里是包括了12个月的月薪加上奖金,而这里奖金就是comm,但是奖金这一列很多都是NULL,而NULL是不参与计算的,所以这里就需要用ifnull(expression ,values)(如果expression为null,返回的值为values否则返回expression)利用这个函数的特点,我们就可以算出年薪 = 12 x sal + ifnull(comm,0); 根据这个要求我们可以写出sql查询语句:select sal * 12 + ifnull(comm,0) 年薪 from emp order by 年薪 desc;

在这里插入图片描述

4.显示工资最高的员工名字和工作岗位
这条语句的要求非常简单,我们可以直接写出对应sql查询语句: select ename , job from emp where sal = (select max(sal) from emp);这里select是可以嵌套使用的,执行顺序就和C语言的中函数一样。当然,这里我们也可以分两步走,先把最高工资打印出来,再让第二条语句中 sal = 最高工资,结果是一样的。

在这里插入图片描述

5. 显示工资高与平均工资的员工信息
这个例子的要求和上面一个例子相差无几,做法也都差不多,先求出平均工资,再作比较即可。我们可以直接写出对应sql查询语句:select * from emp where sal >= (select avg(sal) from emp);

在这里插入图片描述

6.显示每个部门的平均工资与最高工资
这里也是只有两个条件,我们将平均工资和最高工资列出即可。我们可以直接写出对应sql查询语句:select deptno ,avg(sal),max(sal) from emp group by deptno;这里是先分组,然后再对内中内容进行筛查。

在这里插入图片描述

7.显示平均工资低于两千的部门号和它的平均工资
这个例子就需要和上面的例子一样,先对部门进行分组,分完组后就可以计算平均工资,然后再比对工资低于两千的部门。根据上述的条件,我们可以直接写出对应sql查询语句:select deptno ,avg(sal) 平均工资 from emp group by deptno having 平均工资 < 2000;这里的having是最后执行的,所以可以使用平均工资这个别名。

在这里插入图片描述

8.显示每种岗位的雇员总数,平均工资
这个例子和上面几个例子大差不差,这里不再赘述,直接把对应的语句写出:select deptno ,count(job) 人数,avg(sal) 平均工资 from emp group by job;

在这里插入图片描述

2、多表复合查询

前面我们介绍了单张表下的复合查询,但在日常生活中还存在非常的多表查询的情况。

1、显示每一个雇员名,雇员工资和部门名称
这个例子中和上面不同就是我们需要去查询部门名称,部门名称是在dept这张表中,而雇员名称以及工资在emp这张表中。这就需要我们将两张表的内容合并成一张表,也就是对第一张表的每一行内容与第二张表整张表进行组合,这种穷举的方式也叫作笛卡尔积。当然这种方式会生成很多没有啥意义的组合(部门号不对应)。这里我们就可以使用where进行筛查,select * from emp, dept where emp.deptno = dept.deptno结果如下图
>![
经过上述sql语句的筛查基本已经把要求给完成了,我们这里稍微完善一下即可:select ename,sal,dname from emp, dept where emp.deptno = dept.deptno
在这里插入图片描述

3、自链接

前面我们了解了不同表之间的进行链接查询,下面介绍一下同一张表之间链接。以下面这个例子为例:a.显示员工FORD的上级领导的编号和姓名(mgr是员工领导的编号–empno)。这个例子中,我们需要将在FORD的领导编号查出,然后在从当前这张表中查领导的相关信息。由此我们可以写出对应的sql语句:select empno,ename from emp where emp.empno=(select mgr from emp where ename=‘FORD’);

在这里插入图片描述

4、子查询

概念:子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询。前面已有描述,这里就不再赘述

4.1、单行子查询

单行子查询表示的就是返回结果只有一行的子查询,以下面这一个通过下面这个例子帮助了解:
显示SMITH同一部门的员工
这个案例比较简单,我们只需先对SMITH先做子查询即可:select * from emp where deptno = (select deptno from emp where ename=‘smith’);

在这里插入图片描述

4.3、多行子查询

这种子查询返回结果有很多行,但是原本子查询返回结果只有一行,所以这里我们需要将引入一些关键字,才能使其达到多行子查询的效果。

  • in关键字
  • all关键字
  • any关键字

首先我们可以通过一个例子了解一下in关键字:a.查询和10号部门的工作岗位相同的雇员的名字,岗位,工资,部门号,但是不包含10自己.
在这个例子中,我们要先查询10号部门的工作岗位相同的雇员,然后才是其它的相关信息,最后剔除十号部门。
第一步:select distinct job from emp where deptno=10;
第二步:select ename,job,sal,deptno from emp where job in (select distinct job from emp where deptno=10);这里的in在where中作为一种条件判断,表示判断job否在子查询中的表中。
第三步:select ename,job,sal,deptno from emp where job in (select distinct job from emp where deptno=10) and deptno<>10;
在这里插入图片描述

然后,我们通过另外一个例子来增加对all的理解:显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号.这里的all关键字其实和上面的in关键字一样,也是where中作为一种条件判断,代表子查询的所有结果。我们可以直接写出对应的sql语句:select ename, sal, deptno from emp where sal > all(select sal from emp where deptno=30);

在这里插入图片描述

最后一个any,作用和上面两个关键字大同小异,表示子查询的任意一个结果,用一个例子帮助理解:显示工资比部门30的任意员工的工资高的员工的姓名、工资和部门号(包含自己部门的员工).,对应的sql语句:select ename, sal, deptno from emp where sal > any(select sal from emp where deptno=30);

在这里插入图片描述

4.4、多列子查询

单行子查询是指子查询只返回单列,单行数据;多行子查询是指返回单列多行数据,都是针对单列而言的,而多列子查询则是指查询返回多个列数据的子查询语句。以下面例子为例:查询和SMITH的部门和岗位完全相同的所有雇员,不含SMITH本人这里第一步就是筛出SMITH部门和岗位相同的雇员,然后剔除SMITH,我们可以用括号的方式来对子查询各列的数据进行查询比对,具体方式如下: select ename from emp where (deptno, job)=(select deptno, job from emp where ename=‘SMITH’) and ename <> ‘SMITH’;

4.5、from字句中使用子查询

通过对前面的相关知识的了解,我们可以知道,子查询本质其实就是一张新的临时表,所以本质上我们查表都是在查一张表,就是将临时表和原表进行处理后的一张新表。既然上面 where 后面能够使用子查询,那from后面也必然是可以使用子查询的。from后面使用子查询就是将子查询生成的临时表与另外的表做笛卡尔积生成新的表,在从新的表中对数据进行筛查。下面用一个例子来帮助理解:显示每个高于自己部门平均工资的员工的姓名、部门、工资、平均工资
对应的sql语句://获取各个部门的平均工资,将其看作临时表
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;需要
需要注意的时from中子查询形成的临时表要有临时的名称。

5、合并查询

由于这个合并查询并不多见,使用率也较低,所以这里简单介绍即可。

union操作符:该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中的重复行。例子:将工资大于2500或职位是MANAGER的人找出来。 sql语句:select ename, sal, job from emp where sal>2500 union select ename, sal, job fromemp where job='MANAGER';

union all操作符:该操作符用于取得两个结果集的并集。当使用该操作符时,不会去掉结果集中的重复行。例子:将工资大于25000或职位是MANAGER的人找出来。sql语句:select ename, sal, job from emp where sal>2500 union all select ename, sal, job from emp where job='MANAGER';

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

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

相关文章

卷积神经网络 - 卷积层(具体例子)

为了更一步学习卷积神经网络之卷积层&#xff0c;本文我们来通过几个个例子来加深理解。 一、灰度图像和彩色图像的关于特征映射的例子 下面我们通过2个例子来形象说明卷积层中“特征映射”的概念&#xff0c;一个针对灰度图像&#xff0c;一个针对彩色图像。 例子 1&#x…

测试Claude3.7 sonnet画蛋白质

测试Claude3.7 sonnet画蛋白虽然画的很粗糙&#xff0c;但是大致画了出来

java项目之基于ssm的游戏攻略网站(源码+文档)

项目简介 游戏攻略网站实现了以下功能&#xff1a; 管理员主要负责填充图书和其类别信息&#xff0c;并对已填充的数据进行维护&#xff0c;包括修改与删除&#xff0c;管理员也需要审核老师注册信息&#xff0c;发布公告信息&#xff0c;管理自助租房信息等。 &#x1f495;…

本地基于Ollama部署的DeepSeek详细接口文档说明

前文&#xff0c;我们已经在本地基于Ollama部署好了DeepSeek大模型&#xff0c;并且已经告知过如何查看本地的API。为了避免网络安全问题&#xff0c;我们希望已经在本地调优的模型&#xff0c;能够嵌入到在本地的其他应用程序中&#xff0c;发挥本地DeepSeek的作用。因此需要知…

python NameError报错之导库报错

在日常代码编写中&#xff0c;经常出现如 图1 一样的报错&#xff0c;在代码多时很难找到问题&#xff0c;但翻看代码后就会发现是因为未导库&#xff0c; 图1 报错 代码: time.sleep(0.1) print("time库") 解决方法: 第一步:在代码中添加导库代码 import time #…

Web3网络生态中数据保护合规性分析

Web3网络生态中数据保护合规性分析 在这个信息爆炸的时代&#xff0c;Web3网络生态以其独特的去中心化特性&#xff0c;逐渐成为数据交互和价值转移的新平台。Web3&#xff0c;也被称为去中心化互联网&#xff0c;其核心理念是将数据的控制权归还给用户&#xff0c;实现数据的…

C++ 语法之数组指针

一维数组&#xff1a; 如果我们定义了一个一维数组&#xff0c;那么这个数组名&#xff0c;就是指向第一个数组元素的地址&#xff0c;也即&#xff0c;是整个数组分配的内存空间的首地址。 比如 int a[3]; 定义了一个包含三个元素的数组。因为一个int占4个字节&#xff0c;那…

PLY格式文件如何转换成3DTiles格式——使用GISBox软件实现高效转换

一、概述 在三维GIS和数字孪生领域&#xff0c;3DTiles格式已成为主流的数据格式之一。它由Cesium团队提出&#xff0c;专为大规模3D数据可视化设计&#xff0c;能够高效地加载和展示海量模型数据。而PLY格式则是一种常见的三维模型文件格式&#xff0c;主要用于存储点云数据或…

Java定时任务的三重境界:从单机心跳到分布式协调

《Java定时任务的三重境界&#xff1a;从单机心跳到分布式协调》 本文将以生产级代码标准&#xff0c;揭秘Java定时任务从基础API到分布式调度的6种实现范式&#xff0c;深入剖析ScheduledThreadPoolExecutor与Quartz Scheduler的线程模型差异&#xff0c;并给出各方案的性能压…

【Linux网络】手动部署并测试内网穿透

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;博客仓库&#xff1a;https://gitee.com/JohnKingW/linux_test/tree/master/lesson &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &…

java项目之在线购物系统(源码+文档)

项目简介 在线购物系统实现了以下功能&#xff1a; 使用在线购物系统的用户分管理员和用户两个角色的权限子模块。 管理员所能使用的功能主要有&#xff1a;主页、个人中心、用户管理、商品分类管理、商品信息管理、系统管理、订单管理等。 用户可以实现主页、个人中心、我的…

OO_Unit1

第一次作业 UML类图 代码复杂度分析 其中Expr中的toString方法认知复杂度比较高&#xff0c;主要源于多层条件嵌套和分散的字符串处理逻辑&#xff0c;重构时可重点关注这两部分的解耦。 代码量分析 1.”通用形式“ 我觉得我的设计的最大特点就是“通用形式”&#xff0c;具…

重要重要!!fisher矩阵元素有什么含义和原理; Fisher 信息矩阵的形式; 得到fisher矩阵之后怎么使用

fisher矩阵元素有什么含义和原理 目录 fisher矩阵元素有什么含义和原理一、对角线元素( F i , i F_{i,i} Fi,i​)的含义与原理二、非对角线元素( F i , j F_{i,j} Fi,j​)的含义与原理Fisher 信息矩阵的形式矩阵的宽度有位置权重数量决定1. **模型参数结构决定矩阵维度**2.…

[已解决]jupyter notebook报错 500 : Internal Server Error及notebook闪退

jupyter notebook出现如上图的报错&#xff0c;可以在黑色窗口中检查是为什么报错。 我检查发现是nbconvert导致的问题&#xff0c;卸载重装nbconvert。 但是这时候出现&#xff0c;jupyter notebook闪退问题。jupyter的黑色窗口出现一秒钟就没了。 在Anaconda Prompt中检查ju…

2025年渗透测试面试题总结- 某亭-安全研究员(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 一、SQL注入过滤单引号绕过方法 二、MySQL报错注入常用函数 三、报错注入绕WAF 四、MySQL写文件函数…

Redis分布式锁如何实现——简单理解版

目录 前言 满足条件 加锁之后产生的问题 避免死锁的方法 Lua脚本实现避免释放其他锁 看门狗判断过期 扩展 Lua脚本 Redission 前言 在如今开发的某些项目中&#xff0c;多个进程必须以互斥的方式独占共享资源&#xff0c;这时用分布式锁是最直接有效的&#xff0c;分布式…

数字化转型驱动卫生用品安全革新

当315晚会上晃动的暗访镜头揭露卫生巾生产车间里漂浮的异物、纸尿裤原料仓中霉变的碎屑时&#xff0c;这一触目惊心的场景无情地撕开了“贴身安全”的遮羞布&#xff0c;暴露的不仅是部分企业的道德缺失&#xff0c;更凸显了当前检测与监管体系的漏洞&#xff0c;为整个行业敲响…

自适应柔顺性策略:扩散引导控制中学习近似的柔顺

24年10月来自斯坦福大学和 TRI 的论文“Adaptive Compliance Policy: Learning Approximate Compliance for Diffusion Guided Control”。 柔顺性在操作中起着至关重要的作用&#xff0c;因为它可以在不确定的情况下平衡位置和力的并发控制。然而&#xff0c;当今的视觉运动策…

SVN简明教程——下载安装使用

SVN教程目录 一、开发中的实际问题二、简介2.1 版本控制2.2 Subversion2.3 Subversion的优良特性2.4 工作原理2.5 SVN基本操作 三、Subversion的安装与配置1. 服务器端程序版本2. 下载源码包3. 下载二进制安装包4. 安装5. 配置版本库① 为什么要配置版本库&#xff1f;② 创建目…

“智改数转”新风口,物联网如何重构制造业竞争力?

一、政策背景 为深化制造业智能化改造、数字化转型、网络化联接&#xff0c;江苏省制定了《江苏省深化制造业智能化改造数字化转型网络化联接三年行动计划&#xff08;2025&#xff0d;2027年&#xff09;》&#xff0c;提出到2027年&#xff0c;全省制造业企业设备更新、工艺…