八.MySQL复合查询
一.基本查询回顾
分组统计 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 表(部门表)
EMP 员工表 这是员工信息表, deptno 是外键,对应 DEPT 表中的主键。
字段 含义 deptno 部门编号 dname 部门名称 loc 部门所在地
字段 含义 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 不支持)
项目 JOIN
WHERE
条件连接写法 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的人找出来
注意:
UNION
和UNION ALL
合并的 列数必须相同,数据类型必须兼容。默认按第一个
SELECT
的列名作为最终输出表头。如果你要排序,必须加在最后一个
SELECT
之后:
相关文章:

八.MySQL复合查询
一.基本查询回顾 分组统计 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…...
cacti导出的1分钟监控数据csv文件读取并按5分钟求平均值,然后计算95计费值,假设31天的月份
cacti导出的1分钟监控数据csv文件读取并按5分钟求平均值,然后计算95计费值,假设31天的月份 import pandas as pd import openpyxl from openpyxl.styles import Font from openpyxl.utils.dataframe import dataframe_to_rows import os import chardet…...

FastMCP vs MCP:协议标准与实现框架的协同
你好,我是 shengjk1,多年大厂经验,努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注!你会有如下收益: 了解大厂经验拥有和大厂相匹配的技术等 希望看什么,评论或者私信告诉我! 文章目录 一…...

AI视频“入驻”手机,多模态成智能终端的新战场
文|乐乐 今天,无线蓝牙耳机(TWS)已经成为人人都用得起的产品。 但退回到9年前,苹果AirPods是全球第一款真正意义上的无线蓝牙耳机。靠着自研并申请专利的Snoop监听技术,苹果解决了蓝牙耳机左右延时和能耗…...

nginx+tomcat负载均衡群集
一 案例部署Tomcat 目录 一 案例部署Tomcat 1.案例概述 1.1案例前置知识点 (1)Tomcat简介 (2)应用场景 2.实施准备 (1)关闭Linux防火墙 (2)安装Java 2.1 安装配置TOMACT …...
DEEPSEEK帮写的STM32消息流函数,直接可用.已经测试
#include "main.h" #include "MessageBuffer.h"static RingBuffer msgQueue {0};// 初始化队列 void InitQueue(void) {msgQueue.head 0;msgQueue.tail 0;msgQueue.count 0; }// 检查队列状态 type_usart_queue_status GetQueueStatus(void) {if (msgQ…...
day45 python预训练模型
目录 知识点回顾 1. 预训练的概念 2. 常见的分类预训练模型 3. 图像预训练模型的发展史 4. 预训练的策略 5. 预训练代码实战:ResNet18 作业:在 CIFAR-10 上对比 AlexNet 预训练模型 实验结果对比 在深度学习领域,预训练模型已经成为了…...
二维 根据矩阵变换计算缩放比例
在二维空间中,根据矩阵变换计算缩放比例是一个常见的图形学问题。通常,我们通过分析变换矩阵的结构来提取出缩放(Scale)信息。以下是详细的分析和计算方法。 🧮 一、基础:二维变换矩阵结构 在二维仿射变换…...
Vue-Cropper:全面掌握图片裁剪组件
Vue-Cropper 完全学习指南:Vue图片裁剪组件 🎯 什么是 Vue-Cropper? Vue-Cropper 是一个简单易用的Vue图片裁剪组件,支持Vue2和Vue3。它提供了丰富的配置选项和回调方法,可以满足各种图片裁剪需求。 🌟 …...

建造者模式:优雅构建复杂对象
引言 在软件开发中,有时我们需要创建一个由多个部分组成的复杂对象,这些部分可能有不同的变体或配置。如果直接在一个构造函数中设置所有参数,代码会变得难以阅读和维护。当对象构建过程复杂,且需要多个步骤时,我们可…...

现场总线结构在楼宇自控系统中的技术要求与实施要点分析
在建筑智能化程度不断提升的当下,楼宇自控系统承担着协调建筑内各类设备高效运行的重任。传统的集中式控制系统在面对复杂建筑环境时,逐渐暴露出布线繁琐、扩展性差、可靠性低等问题。而现场总线结构凭借其分散控制、通信高效等特性,成为楼宇…...
Axure组件即拖即用:垂直折叠菜单(动态展开/收回交互)
亲爱的小伙伴,在您浏览之前,请关注一下,在此深表感谢!如有帮助请订阅专栏!免费哦! 你是不是也这样崩溃过? 明明设置了点击交互,菜单却像死机一样纹丝不动,F5按烂了都没反…...

学习路之PHP--easyswoole使用视图和模板
学习路之PHP--easyswoole使用视图和模板 一、安装依赖插件二、 实现渲染引擎三、注册渲染引擎四、测试调用写的模板五、优化六、最后补充 一、安装依赖插件 composer require easyswoole/template:1.1.* composer require topthink/think-template相关版本: "…...

《云原生安全攻防》-- K8s网络策略:通过NetworkPolicy实现微隔离
默认情况下,K8s集群的网络是没有任何限制的,所有的Pod之间都可以相互访问。这就意味着,一旦攻击者入侵了某个Pod,就能够访问到集群中任意Pod,存在比较大的安全风险。 在本节课程中,我们将详细介绍如何通过N…...

06 APP 自动化- H5 元素定位
文章目录 H5 元素定位1、APP 分类2、H5 元素3、H5 元素定位环境的搭建4、代码实现: H5 元素定位 1、APP 分类 1、Android 原生 APP2、混合 APP(Android 原生控件H5页面)3、纯 H5 App 2、H5 元素 H5 元素容器 WebViewWebView 控件实现展示网页 3、H5 元素定位环…...
Axure疑难杂症:中继器新增数据时如何上传并存储图片(玩转中继器)
亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢!如有帮助请订阅专栏! Axure产品经理精品视频课已登录CSDN可点击学习https://edu.csdn.net/course/detail/40420 案例视频: 中继器新增数据时如何上传并存储图片 课程主题:中继器新增数据时如何上传并存储图片 主…...

定时线程池失效问题引发的思考
最近在做的一个新功能,在结果探测的时候使用了定时线程池和普通线程池结合,定时线程池周期性创建子任务并往普通线程池提交任务。 问题: 在昨天测试老师发现,业务实际上已经成功了,但是页面还是一直显示进行中。 收到…...
Vue-ref 与 props
一、前言 在 Vue 的组件化开发中,父子组件之间的数据传递 是一个非常核心的需求。常见的场景包括: 父组件向子组件传递数据;子组件向父组件发送事件或数据;父组件直接调用子组件的方法或访问其属性。 Vue 提供了多种机制来实现…...

AXURE安装+汉化-Windows
安装网站:https://www.axure.com/release-history/rp9 Axure中文汉化包下载地址 链接:https://pan.baidu.com/s/1U62Azk8lkRPBqWAcrJMFew?pwd5418 提取码:5418 下载完成之后,crtlc lang文件夹 到下载的Axure路径下 双击点进这个目录里面。ctrlv把lan…...

ArcGIS Pro字段计算器与计算几何不可用,显示灰色
“字段计算器”不可用 如果计算字段命令不可用,请考虑以下可能性: 由 ArcGIS 管理的字段无法手动编辑。因此,无法计算 ObjectID(OID 或 FID)字段或地理数据库要素类的 Shape_Length 和 Shape_Area 字段的字段值。表中…...

mac电脑安装 nvm 报错如何解决
前言 已知:安装nvm成功;终端输入nvm -v 有版本返回 1. 启动全局配置环境变量失败 source ~/.zshrc~ 返回: source: no such file or directory: /Users/你的用户名/.zshrc~2 安装node失败 nvm install 16.13返回: mkdir: /U…...

第11节 Node.js 模块系统
为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统。 模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的。换言之,一个 Node.js 文件就是一个模块,这个文件可能是JavaScript 代码、JSON 或者编译过的…...

上海工作机会:Technical Writer Senior Technical Writer - 中微半导体设备
大名鼎鼎的中微半导体招聘文档工程师了,就是那家由中国半导体产业的领军人物尹志尧领导的、全员持股的公司。如果你还不了解他,赶快Deepseek一下“尹志尧”了解。 招聘职位:Technical Writer & Senior Technical Writer 公司名称&#…...
String 学习总结
1. 存储机制 短字符串优化(SSO, Small String Optimization) 现代标准库中的字符串实现普遍采用 SSO 技术,将长度较短(例如 ≤15 字节)的字符串数据直接存储在字符串对象内部的固定缓冲区(栈上)…...

Python微积分可视化:从导数到积分的交互式教学工具
Python微积分可视化:从导数到积分的交互式教学工具 一、引言 微积分是理解自然科学的基础,但抽象的导数、积分概念常让初学者感到困惑。本文基于Matplotlib开发一套微积分可视化工具,通过动态图像直观展示导数的几何意义、积分的近似计算及跨学科应用,帮助读者建立"数…...

Juce实现Table自定义
Juce实现Table自定义 一.总体展示概及概述 在项目中Juce中TableList往往无法满足用户需求,头部和背景及背景颜色设置以及在Cell中添加自定义按钮,所以需要自己实现自定义TabelList,该示例是展示实现自定义TableList,实现自定义标…...
【25.06】fabric进行caliper测试加环境部署
前置条件 安装一个Ubuntu20+的镜像 基础环境安装 Git cURL vim jq sudo apt install -y git curl vim jq Docker和Docker-compose 这个命令会自动安装docker sudo apt install docker-compose sudo chmod +x /usr/bin/docker-compose docker versiondocker-compose vers…...

【后端高阶面经:架构篇】51、搜索引擎架构与排序算法:面试关键知识点全解析
一、搜索引擎核心基石:倒排索引技术深度解析 (一)倒排索引的本质与构建流程 倒排索引(Inverted Index)是搜索引擎实现快速检索的核心数据结构,与传统数据库的正向索引(文档→关键词࿰…...

Windows应用-音视频捕获
下载“Windows应用-音视频捕获”项目 本应用可以同时捕获4个视频源和4个音频源,可以监视视频源图像,监听音频源;可以将视频源图像写入MP4文件,将音频源写入MP3或WAV文件;还可以录制系统播放的声音。本应用使用MFC对话框…...

【OCCT+ImGUI系列】012-Geom2d_AxisPlacement
Geom2d_AxisPlacement 教学笔记 一、类概述 Geom2d_AxisPlacement 表示二维几何空间中的一个坐标轴(轴系),由两部分组成: gp_Pnt2d:原点(Location)gp_Dir2d:单位方向向量ÿ…...