当前位置: 首页 > article >正文

八.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 表(部门表)

字段含义
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 之后:

相关文章:

八.MySQL复合查询

一.基本查询回顾 分组统计 group by 函数作用示例语句说明count(*)统计记录条数select deptno, count(*) from emp group by deptno;每个部门有多少人&#xff1f;sum(sal)某字段求和select deptno, sum(sal) from emp group by deptno;每个部门总工资avg(sal)求平均值select…...

cacti导出的1分钟监控数据csv文件读取并按5分钟求平均值,然后计算95计费值,假设31天的月份

cacti导出的1分钟监控数据csv文件读取并按5分钟求平均值&#xff0c;然后计算95计费值&#xff0c;假设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:协议标准与实现框架的协同

你好&#xff0c;我是 shengjk1&#xff0c;多年大厂经验&#xff0c;努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注&#xff01;你会有如下收益&#xff1a; 了解大厂经验拥有和大厂相匹配的技术等 希望看什么&#xff0c;评论或者私信告诉我&#xff01; 文章目录 一…...

AI视频“入驻”手机,多模态成智能终端的新战场

文&#xff5c;乐乐 今天&#xff0c;无线蓝牙耳机&#xff08;TWS&#xff09;已经成为人人都用得起的产品。 但退回到9年前&#xff0c;苹果AirPods是全球第一款真正意义上的无线蓝牙耳机。靠着自研并申请专利的Snoop监听技术&#xff0c;苹果解决了蓝牙耳机左右延时和能耗…...

nginx+tomcat负载均衡群集

一 案例部署Tomcat 目录 一 案例部署Tomcat 1.案例概述 1.1案例前置知识点 &#xff08;1&#xff09;Tomcat简介 &#xff08;2&#xff09;应用场景 2.实施准备 &#xff08;1&#xff09;关闭Linux防火墙 &#xff08;2&#xff09;安装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. 预训练代码实战&#xff1a;ResNet18 作业&#xff1a;在 CIFAR-10 上对比 AlexNet 预训练模型 实验结果对比 在深度学习领域&#xff0c;预训练模型已经成为了…...

二维 根据矩阵变换计算缩放比例

在二维空间中&#xff0c;根据矩阵变换计算缩放比例是一个常见的图形学问题。通常&#xff0c;我们通过分析变换矩阵的结构来提取出缩放&#xff08;Scale&#xff09;信息。以下是详细的分析和计算方法。 &#x1f9ee; 一、基础&#xff1a;二维变换矩阵结构 在二维仿射变换…...

Vue-Cropper:全面掌握图片裁剪组件

Vue-Cropper 完全学习指南&#xff1a;Vue图片裁剪组件 &#x1f3af; 什么是 Vue-Cropper&#xff1f; Vue-Cropper 是一个简单易用的Vue图片裁剪组件&#xff0c;支持Vue2和Vue3。它提供了丰富的配置选项和回调方法&#xff0c;可以满足各种图片裁剪需求。 &#x1f31f; …...

建造者模式:优雅构建复杂对象

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

现场总线结构在楼宇自控系统中的技术要求与实施要点分析

在建筑智能化程度不断提升的当下&#xff0c;楼宇自控系统承担着协调建筑内各类设备高效运行的重任。传统的集中式控制系统在面对复杂建筑环境时&#xff0c;逐渐暴露出布线繁琐、扩展性差、可靠性低等问题。而现场总线结构凭借其分散控制、通信高效等特性&#xff0c;成为楼宇…...

Axure组件即拖即用:垂直折叠菜单(动态展开/收回交互)

亲爱的小伙伴&#xff0c;在您浏览之前&#xff0c;请关注一下&#xff0c;在此深表感谢&#xff01;如有帮助请订阅专栏&#xff01;免费哦&#xff01; 你是不是也这样崩溃过&#xff1f; 明明设置了点击交互&#xff0c;菜单却像死机一样纹丝不动&#xff0c;F5按烂了都没反…...

学习路之PHP--easyswoole使用视图和模板

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

《云原生安全攻防》-- K8s网络策略:通过NetworkPolicy实现微隔离

默认情况下&#xff0c;K8s集群的网络是没有任何限制的&#xff0c;所有的Pod之间都可以相互访问。这就意味着&#xff0c;一旦攻击者入侵了某个Pod&#xff0c;就能够访问到集群中任意Pod&#xff0c;存在比较大的安全风险。 在本节课程中&#xff0c;我们将详细介绍如何通过N…...

06 APP 自动化- H5 元素定位

文章目录 H5 元素定位1、APP 分类2、H5 元素3、H5 元素定位环境的搭建4、代码实现&#xff1a; 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 案例视频: 中继器新增数据时如何上传并存储图片 课程主题:中继器新增数据时如何上传并存储图片 主…...

定时线程池失效问题引发的思考

最近在做的一个新功能&#xff0c;在结果探测的时候使用了定时线程池和普通线程池结合&#xff0c;定时线程池周期性创建子任务并往普通线程池提交任务。 问题&#xff1a; 在昨天测试老师发现&#xff0c;业务实际上已经成功了&#xff0c;但是页面还是一直显示进行中。 收到…...

Vue-ref 与 props

一、前言 在 Vue 的组件化开发中&#xff0c;父子组件之间的数据传递 是一个非常核心的需求。常见的场景包括&#xff1a; 父组件向子组件传递数据&#xff1b;子组件向父组件发送事件或数据&#xff1b;父组件直接调用子组件的方法或访问其属性。 Vue 提供了多种机制来实现…...

AXURE安装+汉化-Windows

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

ArcGIS Pro字段计算器与计算几何不可用,显示灰色

“字段计算器”不可用 如果计算字段命令不可用&#xff0c;请考虑以下可能性&#xff1a; 由 ArcGIS 管理的字段无法手动编辑。因此&#xff0c;无法计算 ObjectID&#xff08;OID 或 FID&#xff09;字段或地理数据库要素类的 Shape_Length 和 Shape_Area 字段的字段值。表中…...

mac电脑安装 nvm 报错如何解决

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

第11节 Node.js 模块系统

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

上海工作机会:Technical Writer Senior Technical Writer - 中微半导体设备

大名鼎鼎的中微半导体招聘文档工程师了&#xff0c;就是那家由中国半导体产业的领军人物尹志尧领导的、全员持股的公司。如果你还不了解他&#xff0c;赶快Deepseek一下“尹志尧”了解。 招聘职位&#xff1a;Technical Writer & Senior Technical Writer 公司名称&#…...

String 学习总结

1. 存储机制 短字符串优化&#xff08;SSO, Small String Optimization&#xff09; 现代标准库中的字符串实现普遍采用 SSO 技术&#xff0c;将长度较短&#xff08;例如 ≤15 字节&#xff09;的字符串数据直接存储在字符串对象内部的固定缓冲区&#xff08;栈上&#xff09;…...

Python微积分可视化:从导数到积分的交互式教学工具

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

Juce实现Table自定义

Juce实现Table自定义 一.总体展示概及概述 在项目中Juce中TableList往往无法满足用户需求&#xff0c;头部和背景及背景颜色设置以及在Cell中添加自定义按钮&#xff0c;所以需要自己实现自定义TabelList&#xff0c;该示例是展示实现自定义TableList&#xff0c;实现自定义标…...

【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、搜索引擎架构与排序算法:面试关键知识点全解析

一、搜索引擎核心基石&#xff1a;倒排索引技术深度解析 &#xff08;一&#xff09;倒排索引的本质与构建流程 倒排索引&#xff08;Inverted Index&#xff09;是搜索引擎实现快速检索的核心数据结构&#xff0c;与传统数据库的正向索引&#xff08;文档→关键词&#xff0…...

Windows应用-音视频捕获

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

【OCCT+ImGUI系列】012-Geom2d_AxisPlacement

Geom2d_AxisPlacement 教学笔记 一、类概述 Geom2d_AxisPlacement 表示二维几何空间中的一个坐标轴&#xff08;轴系&#xff09;&#xff0c;由两部分组成&#xff1a; gp_Pnt2d&#xff1a;原点&#xff08;Location&#xff09;gp_Dir2d&#xff1a;单位方向向量&#xff…...