八.MySQL复合查询

article/2025/6/7 14:37:38

一.基本查询回顾

分组统计 group by

函数作用示例语句说明
count(*)统计记录条数select deptno, count(*) from emp group by deptno;每个部门有多少人?
sum(sal)某字段求和select deptno, sum(sal) from emp group by deptno;每个部门总工资
avg(sal)求平均值select deptno, avg(sal) from emp group by deptno;每个部门平均工资
max(sal)最大值select job, max(sal) from emp group by job;每个职位最高工资
min(sal)最小值select job, min(sal) from emp group by job;每个职位最低工资

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

(sal>500 or job=MANAGER)and(ename like'J%')

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

order by depton asc , sal desc

3.使用年薪进行降序排序

年薪=sal*12+comm  comm有的为NULL,任何值加上NULL都为NULL 但我们运算时遇到NULL要把他视为0

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

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

        1.先找出最高工资为多少

        2.再根据最高工资筛选出 符合条件的

select max(sal) from emp;

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

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

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

1.平均薪资 select avg(sal) from emp;

2.最高新增 select max(sal) from emp;

3. 根据部门分组  select * from emp group by(deptno);

select deptno,avg(sal), max(sal) from emp group by(deptno);

format(值,保留几位小数)

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

        1.group by 对表按部门号进行分组 

        2.having 对分组聚合后的结果进行筛选

        3.select avg(sal) 输出平均薪资 

select deptno,avg(sal) 平均薪资 from EMP group by deptno  having 平均薪资<2000;

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

        1.按岗位分组

        2.分完组 count(*)计算每个组的行数  avg(sal)计算每个组的平均薪资

        3.select 输出

 select  job,count(*) 岗位数,format(avg(sal),2) 平均薪资 from EMP group by job;

二.多表查询

实际开发中往往数据来自不同的表,所以需要多表查询。本节我们用一个简单的公司管理系统,有三张表EMP,DEPT,SALGRADE来演示如何进行多表查询。
案例:
显示雇员名、雇员工资以及所在部门的名字因为上面的数据来自EMP和DEPT表,因此要联合查询

DEPT 表(部门表)

字段含义
deptno部门编号
dname部门名称
loc部门所在地
EMP 员工表 这是员工信息表, deptno 是外键,对应 DEPT 表中的主键。
字段含义
empno员工编号
ename员工姓名
job岗位
mgr上级编号
hiredate入职日期
sal工资
comm奖金
deptno所属部门编号

select * from EMP,DEPT;

没有添加任何连接条件时,MySQL 会把 EMP 表的每一行和 DEPT 表的每一行全部组合,形成 笛卡尔积

假设:

  • EMP 表有 14 条记录

  • DEPT 表有 4 条记录

那么结果是:14 × 4 = 56 条记录

每一条记录是:EMP 表中一名员工 + DEPT 表中任一部门的组合。这个结果毫无实际意义!

联表:1.where 添加连接条件

where e.deptno=d.deptno

把员工分配到他们真正所在的部门,避免出现无意义的组合(也就是避免笛卡尔积)。

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

select dname,ename,sal,e.deptno from EMP e,DEPT d

where e.deptno=d.deptno and e.deptno=10;

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

select ename,sal,grade from EMP e,SALGRADE s where sal between losal and hisal;

between 最小值 and 最大值 是否在该范围内(含边界值)

between ... and ... 是 SQL 中的一个 范围判断操作符,它表示某个值是否在两个值之间(包含边界)

联表:2.join 表 on 添加连接条件

JOIN 是 SQL 中用于 多表连接查询 的语法,它通过指定的条件把多张表的数据连接成一张大表

类型作用说明
INNER JOIN两表匹配成功才显示(最常用)
LEFT JOIN左表全保留,右表能对上就显示,不能对上为 NULL
RIGHT JOIN右表全保留,左表不能对上为 NULL
FULL JOIN两边都保留,不匹配的补 NULL(MySQL 不支持)
项目JOINWHERE 条件连接
写法FROM A JOIN B ON 条件FROM A, B WHERE A.id = B.id
推荐程度✅ 推荐,更清晰、规范🟡 可用,老写法,容易出错
逻辑结构显式地指定连接方式模糊:连接条件和筛选条件混在一起
支持多种连接✅ 支持 INNER、LEFT、RIGHT 等🚫 只能做 INNER JOIN 效果
可读性✅ 强🟡 较弱

把员工和他们所在的部门名对应起来

1.where:

from 引入两个关联的表  where 添加连接条件

2.join on:

from 引入一个表

join 再引入关联的表  on  连接条件

JOIN 负责“怎么连”,WHERE 负责“连完之后怎么筛”。

三.自连接

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

用于处理 表中记录之间有层级关系 的场景,例如:

  • 员工表中,mgr 字段是上级的 empno(员工编号)

  • 我们需要通过员工的 mgr 去找到他上级是谁(也在同一张表里)

查出“FORD的上级领导编号和姓名”

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

        1.子查询方式:

select empno,ename,job,mgr from EMP

where (select mgr from EMP where ename='FORD')=empno;

查找ename=‘FORD’员工的mgr领导编号select mgr from EMP where ename='FORD'

        2.自连接

select leader.empno,leader.ename from EMP leader, EMP worker

where leader.empno = worker.mgr and worker.ename='FORD';

where leader.empno = worker.mgr 找到每个员工对应的领导   and worker.ename='FORD';找到指定员工的领导

注意:要显示领导的信息select leader.empno,leader.ename

四.子查询

1.单列子查询

返回一行记录的子查询
1.显示SMITH同一部门的员工

2.多行子查询

1.in在结果集合中匹配任意一个

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

        1.10号部门的工资岗位种类有什么

select distinct job from EMP where deptno=10;distinct去重

        2.找属于该工作岗位表中的员工 

job in (工作岗位表)

        3.去掉10号部门人

deptno!=10

 

2.all 大于所有返回值才成立

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

方法1:

        1.部门30员工的最大值

max(als) where deptno=30;

        2.大于部门30最大值的员工

>max

select ename, sal, deptno from EMP

where sal > (select max(sal) from EMP where deptno=30);

比30号部门的最大值大

方法2:

select ename, sal, deptno from EMP

where sal > all(select sal from EMP where deptno=30);

比30号部门all所有值大

3.any 只要大于其中一个值就行

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

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

3.多列子查询

多行子查询 都是根据一个字段来进行查询,如果多个字段呢?

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

4.在from子句中使用子查询

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

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

        1.group by + avg() 得到部门+部门平均工资的表

        2.将员工表,部门工资表进行笛卡儿积 where 连接条件为部门号相同。这样融合后的表就有所有员工的薪资+每个部门的平均薪资

select ename, t1.deptno, sal, format(sal,2) from EMP t1,

(select deptno,avg(sal) 部门资 from EMP group by deptno) t2

where t1.deptno=t2.deptno and  t1.sal>t2.部门资 ;   

//注意一定要添加连接条件 t1.deptno=t2.deptno 取掉无效笛卡儿积

where 连接条件+筛选条件

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

        1.group by+max() 部门+部门最高薪资

        2.连接 where+连接条件(部门相同)+筛选条件(最高薪资相同)

select ename,t1.deptno,sal,t2.最高薪资 from EMP t1,

(select deptno,max(sal) 最高薪资 from EMP group by deptno) t2

where t1.deptno=t2.deptno and t1.sal=t2.最高薪资;

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

        1.group by+count(*) 部门号+每个部门人数

        2.from DEPT连接表包含部门信息

select DEPT.deptno, dname, mycnt, loc from DEPT,

(select deptno,count(*) mycnt  from EMP group by deptno) t

where DEPT.deptno=t.deptno;

五.合并查询(union/ union all)

1.union (去重)

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

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

2.union all(不去重)

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

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

注意:

  • UNIONUNION ALL 合并的 列数必须相同,数据类型必须兼容

  • 默认按第一个 SELECT 的列名作为最终输出表头。

  • 如果你要排序,必须加在最后一个 SELECT 之后:


http://www.hkcw.cn/article/VaAqTNTdLx.shtml

相关文章

智能补丁管理:终结安全漏洞,开启自动化运维新时代

漏洞风暴&#xff1a;数字化时代的隐形战场 全球安全态势的范式转移 近年来&#xff0c;终端层漏洞已成为企业安全防线的最大突破口。根据美国国家标准与技术研究院&#xff08;NIST&#xff09;的监测数据&#xff0c;2023年新披露的高危漏洞数量同比增长62%&#xff0c;其中…

大模型 提示模板 设计

大模型 提示模板 设计 论文介绍:LangGPT - 从编程语言视角重构大语言模型结构化可复用提示设计框架 核心问题: 现有提示工程缺乏结构化设计模板,依赖经验优化,学习成本高且复用性低,难以支持提示的迭代更新。 创新思路: 受编程语言的结构化和可复用性启发,提出LangGP…

不连网也能跑大模型?

一、这是个什么 App&#xff1f; 你有没有想过&#xff0c;不用连网&#xff0c;你的手机也能像 ChatGPT 那样生成文字、识别图片、甚至回答复杂问题&#xff1f;Google 最近悄悄发布了一个实验性 Android 应用——AI Edge Gallery&#xff0c;就是为此而生的。 这个应用不在…

基于开源AI大模型与AI智能名片的S2B2C商城小程序源码优化:企业成本管理与获客留存的新范式

摘要&#xff1a;本文以企业成本管理的两大核心——外部成本与内部成本为切入点&#xff0c;结合开源AI大模型、AI智能名片及S2B2C商城小程序源码技术&#xff0c;构建了企业数字化转型的“技术-成本-运营”三维模型。研究结果表明&#xff0c;通过AI智能名片实现获客留存效率提…

【AFW+GRU(CNN+RNN)】Deepfakes Detection with Automatic Face Weighting

文章目录 Deepfakes Detection with Automatic Face Weighting背景pointsDeepfake检测挑战数据集方法人脸检测面部特征提取自动人脸加权门控循环单元训练流程提升网络测试时间增强实验结果Deepfakes Detection with Automatic Face Weighting 会议/期刊:CVPRW 2020 作者: …

【Zephyr 系列 6】使用 Zephyr + BLE 打造蓝牙广播与连接系统(STEVAL-IDB011V1 实战)

🧠关键词:Zephyr、BLE、广播、连接、GATT、低功耗蓝牙、STEVAL-IDB011V1 📌适合人群:希望基于 Zephyr 实现 BLE 通信的嵌入式工程师、蓝牙产品开发人员 🧭 前言:为什么选择 Zephyr 开发 BLE? 在传统 BLE 开发中,我们大多依赖于厂商 SDK(如 Nordic SDK、BlueNRG SD…

【前端后端环境】

学习视频【带小白做毕设02】从0开始手把手带你做Vue框架的快速搭建以及项目工程的讲解 C:\Users\Again>java -version java version "21.0.1" 2023-10-17 LTS Java(TM) SE Runtime Environment (build 21.0.112-LTS-29) Java HotSpot(TM) 64-Bit Server VM (buil…

机器学习:决策树和剪枝

本文目录&#xff1a; 一、决策树基本知识&#xff08;一&#xff09;概念&#xff08;二&#xff09;决策树建立过程 二、决策树生成&#xff08;一&#xff09;ID3决策树&#xff1a;基于信息增益构建的决策树。&#xff08;二&#xff09;C4.5决策树&#xff08;三&#xff…

【Vmware】虚拟机安装、镜像安装、Nat网络模式、本地VM8、ssh链接保姆篇(图文教程)

文章目录 Vmware下载Vmware安装镜像安装虚拟机安装网络模式Nat模式设置ssh链接 更多相关内容可查看 Vmware下载 官网下载地址&#xff1a;https://vmoc.waltzsy.com/?bd_vid8868926919570357435#goods Vmware安装 以管理员身份运行 弹框如下&#xff0c;点击下一步 我同意&…

移动端测试岗位高频面试题及解析

文章目录 一、基础概念二、自动化测试三、性能测试四、专项测试五、安全与稳定性六、高级场景七、实战难题八、其他面题 一、基础概念 移动端测试与Web测试的核心区别&#xff1f; 解析&#xff1a;网络波动&#xff08;弱网测试&#xff09;、设备碎片化&#xff08;机型适配&…

什么是“草台班子”?

“草台班子”是一个常用的汉语俗语&#xff0c;其含义在不同语境下略有差异&#xff0c;核心特点是强调组织或团队的非专业性、临时性和不规范性。以下从原意、引申义、常见用法三方面展开说明&#xff1a; 一、原意&#xff1a;传统戏曲中的流动演出团体 起源&#xff1a; 最…

无人机避障——感知部分(Ubuntu 20.04 复现Vins Fusion跑数据集)胎教级教程

硬件环境&#xff1a;NVIDIA Jeston Orin nx 系统&#xff1a;Ubuntu 20.04 任务&#xff1a;跑通 EuRoC MAV Dataset 数据集 展示结果&#xff1a; 编译Vins Fusion 创建工作空间vins_ws # 创建目录结构 mkdir -p ~/vins_ws/srccd ~/vins_ws/src# 初始化工作空间&#xf…

AI网校平台开发探索:集成直播、考试题库、白板互动的教育系统源码

当下&#xff0c;如何构建一个真正符合“未来教育”形态的网校平台&#xff0c;成为越来越多教育机构与技术团队关注的焦点。本篇文章&#xff0c;笔者想对教育系统源码的理解与实践&#xff0c;尤其是围绕直播、录播、考试题库与白板互动等核心功能的整合探索。 一、教育行业…

景区停车预警系统:从检测到疏导,告别拥堵!

节假日景区门口堵成长龙&#xff0c;游客找车位难&#xff0c;管理压力大&#xff1f;一套智能停车预警疏导系统是关键。4G地磁检测技术&#xff0c;是构建这套系统的稳定基石。 一、车位实时检测&#xff1a;数据精准是基础 知道车位有没有车、有多少空位是第一步。4G地磁埋…

仓颉项目调试配置与多文件场景下的问题解析

1. 调试配置指南 在 VS Code 中配置好仓颉开发工具链后&#xff0c;只需按下 F5 或 Fn F5 即可启动调试。 在 CodeArts IDE for Cangjie 中&#xff0c;需先通过右上角的 编辑配置 -> 新增配置项 -> 选择 Cangjie (cjdb) Debug -> 选择 launch 模式 -> 点击 确认…

【北邮 操作系统】第十三章 I/O系统

最后一章啦&#xff0c;完结撒花hhh 一、I/O设备的概念和分类 【1】I/O设备的概念&#xff1a;I/0设备就是可以将数据输入到计算机&#xff0c;或者可以接收计算机输出数据的外部设备&#xff0c;属于计算机中的硬件部件。 【2】I/O设备的类型 设备按传输速率分类&#xff…

机器学习——放回抽样

为了构建树集成模型&#xff0c;需要一种叫做有放回采样的技术。 以4个标记为演示&#xff0c;分别是红色、黄色、绿色和蓝色&#xff0c;用一个黑色的袋子把这四个标记的例子放进去&#xff0c;然后从这个袋子里有放回地抽取四次&#xff0c;抽出一个标记&#xff0c;结果是绿…

组相对策略优化(GRPO):原理及源码解析

文章目录 PPO vs GRPOPPO的目标函数GRPO的目标函数KL散度约束与估计ORM监督RL的结果PRM监督RL的过程迭代RL算法流程 GRPO损失的不同版本GRPO源码解析 DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models PPO vs GRPO PPO的目标函数 J P P O…

黑马Java面试笔记之 集合篇(算法复杂度+ArrayList+)

一. 算法复杂度分析 1.1 时间复杂度 时间复杂度分析&#xff1a;来评估代码的执行耗时的 常见的复杂度表示形式 常见复杂度 1.2 空间复杂度 空间复杂度全称是渐进空间复杂度&#xff0c;表示算法占用的额外存储空间与数据规模之间的增长关系 二. 数组 数组&#xff08;Array&a…

AI数据集构建:从爬虫到标注的全流程指南

AI数据集构建&#xff1a;从爬虫到标注的全流程指南 系统化学习人工智能网站&#xff08;收藏&#xff09;&#xff1a;https://www.captainbed.cn/flu 文章目录 AI数据集构建&#xff1a;从爬虫到标注的全流程指南摘要引言流程图&#xff1a;数据集构建全生命周期一、数据采…