MySQL:复杂查询 (一)——聚合函数分组查询联合查询

news2024/9/23 21:23:49

目录

1、聚合查询

1.1 聚合函数

1.1.1 COUNT()

1.1.2 SUM()

1.1.3 AVG()

1.1.4 MAX(),MIN()

1.2 分组查询

1.2.1 GROUP BY子句

 1.2.1.1 round()

1.2.2 HAVING

1.2.3 示例

2、联合查询

2.1 ①取相关表笛卡尔积 

2.2 ②过滤无效数据

2.3 ③精简查询结果

2.3.1 表的别名

3、综合练习

3.1 问题一

3.2 问题二


1、聚合查询

聚合查询是针对某一列数据的行与行之间进行的运算。

而我们之前所学的表达式查询是针对某一行数据的列与列之间进行的运算。

简单来说,聚合查询是竖着的,表达式查询是横着的。

1.1 聚合函数

聚合函数是MySQL内置的函数,我们可按需调用。

1.1.1 COUNT()

count():返回表中记录的总行数。

  • 函数参数可传 *,表示根据任意一列计算行数(推荐)
  • 函数参数可传常量
  • 函数参数可传指定的列,表示根据这一列计算行数。
  • 注意:当所传参数为列时,若该列存在数值为NULL的行,则不将为NULL的行计算进行数中。

1.1.2 SUM()

sum():把查询结果中所有行的指定列的数据相加。

注意:

  • 列的数据类型必须为数值型,不能为字符型或日期型。
  • 若指定的列中有数值为NULL,则NULL视为无效数据不计算进列的和。(之前我们学到,不管什么数值与NULL进行运算,结果都为NULL,但是这里不同,是因为函数内部进行了处理)
  • 通过sum函数求得的结果的值,不受表中字段类型的约束。

1.1.3 AVG()

avg():计算所有行的指定列的平均数。

我们既可以计算列的平均值,也可以计算表达式的平均值:

我们同样可以给列或表达式别名:

1.1.4 MAX(),MIN()

max():返回所有行指定的列的最大值。

min():返回所有行指定的列的最小值。

注意:多个聚合函数可以同时使用:

注意:

  • 在使用关于运算的聚合函数时(比如sum、avg、max、min),只能用于计算数值类型的列。
  • 在使用聚合函数时,都可以结合之前所学的where、limit等子句

1.2 分组查询

1.2.1 GROUP BY子句

在select中使用group by子句可以对指定列进行分组查询。

需要满足:使用group by进行分组查询时,select指定的字段必须是“分组依据字段”,其他字段若想出现在select中则必须包含在聚合函数中。

这里创建了一个公司员工表单:

我们根据职位role进行分组,则select查询到结果集中的列只能是role或者是包含于聚合函数中的其他列:

注意:在SQL语句中,一定有着这样的执行顺序:先选表,再分组,再select查询,所以我们不能通过别名来分组

 1.2.1.1 round()

在上图中,我们可以看到,通过聚合函数计算所得的值小数点后有6位,我们可以通过round函数手动设置小数位数:

语法:round(聚合函数,n)  n为手动设置的小数位数

同样,我们可以根据实际需要后跟order和limit子句:

注意:order子句是select查询后执行的,所以可以使用别名进行排序。

1.2.2 HAVING

group by子句进行分组以后,需要对分组结果再进行条件过滤时,不能使用 where子句,而需要用 having

注意:having跟在group by子句后

查询平均薪资大于1w且小于2w的职位:

注意:having子句是在分组完成后执行的,此时还没有执行select子句,故不能使用别名进行过滤,否则报错。执行顺序如下:

这里需要注意where过滤与having过滤的区别:

  1. where跟在 from+表名 的后面,在选好表后就要进行过滤,过滤的是分组前的数据
  2. having子句跟在group by子句的后面,是对分组后的结果进行过滤
  3. where过滤的是表中每一行真实的数据
  4. having过滤的是分组后通过聚合函数计算出的结果,而并非表中真实存在的
  5. 根据实际需求,可结合where和having完成过滤操作

1.2.3 示例

示例一:查询每个职位的最高工资、最低工资和平均工资:

-- 查询每个职位的最高工资、最低工资和平均工资:
select role,round(avg(salary),2) 平均薪资,round(max(salary),2) 最高薪资,round(min(salary),2) 最低薪资 from emp group by role;

示例二:显示平均工资低于1500的职位和它的平均工资

-- 显示平均工资低于1500的职位和它的平均工资
select role,round(avg(salary),2) 平均薪资 from emp group by role having avg(salary) < 1500;

2、联合查询

在设计表时,为了消除表中字段的部分函数依赖、传递依赖,我们通常会对数据进行拆分,拆分为多个表后再经过建立主外键关系进行关系的关联。但是这样也产生了一些问题,就是我们在使用select查询数据时,查询出来的记录是不完整、不明确的,例如下图:

而我们可以通过联合查询,使数据更加完整、明确的展现出来:

联合查询也是在工作中最常用的查询。

如何通过联合查询查询结果呢?有以下几个步骤:

  1. 确定那几张表要参与查询,取这几张表的笛卡尔积(全排列):select * from 表1,表2;
  2. 根据表与表之间的主外键关系,确定过滤条件,过滤无效数据(可根据实际情况继续过滤)
  3. 通过指定列查询,精简结果集

2.1 ①取相关表笛卡尔积 

联合查询的第一步就是取要查询的相关表的笛卡尔积,笛卡尔积即数据的全排列,上文的学生表和班级的表的笛卡尔积为下图:

取笛卡尔积:select * from 表1,表2;

执行SQL取笛卡尔积:

2.2 ②过滤无效数据

获取的笛卡尔积中存在着大量无效数据,我们需要过滤掉这些数据。

联合的表之间必然存在主外键关系,通过主外键值过滤无效数据。判断子表外键值和主表主键值是否相等即可,保留相等的,过滤不相等的。

因为主外键字段存在于两个表中,所以我们应该使用 表名.字段 的形式,指定哪个表中的哪个字段:

2.3 ③精简查询结果

上图中,我们可以发现表中有好多个无用字段如:class_id、id,我们可以通过 select 表名.列名 的形式,抽取出有用的字段来精简查询结果,

注意:因为存在多个表,所以一定是 select  表名.列名 的形式,明确哪个表中的哪个字段!

2.3.1 表的别名

通过 表名.列明 的方式是必要的,但是使得书写的代码量增多,我们可以通过给表起别名的方式简化代码,我们可以在 from 表名 后给表起一个更加简短的别名,这样我们就这样在select和where子句中缩短表名长度:


3、综合练习

这里分别建好了4个表,大家简单瞄一眼即可:

班级表:

课程表:

成绩表:

学生表:

3.1 问题一

查询许仙同学的成绩:

根据题目可以推断出需要联合学生表和成绩表两个相关表,根据上文所讲过程,即可查询成功:

3.2 问题二

查询所有同学的总成绩和信息:

  1. 因为要查询成绩和学生信息,所以我们要将成绩表和学生表进行联合,并过滤掉无效数据
  2. 根据题目信息,因为要查询每人的总成绩,一个同学为一组,所以我们要进行分组,而分组我们要根据编号student.student_id进行分组,因为学生姓名可能会出现重名的现象
  3. 通过select,查询学号、姓名等学生信息字段,利用聚合函数计算每名学生总成绩


END

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

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

相关文章

【数据结构】队列,你必须知道的内部原理!!!

&#x1f31e;&#x1f31e;&#x1f31e;生活本就沉闷&#xff0c;但跑起来就会有风 ~~~ 前言&#xff1a; &#x1f31f;&#x1f31f;Hello家人们&#xff0c;这期讲解数据结构队列的基础知识&#xff0c;希望你能帮到屏幕前的你。 &#x1f4da;️上期博客在这里&#xff1…

书生基础岛1-开发全链路

涌现能力&#xff1a;知识到运用的能力。 开源工具箱&#xff1a; 预训练&#xff1a; 微调&#xff1a; 部署&#xff1a; 智能体&#xff1a; 智能体&#xff1a; 知识库构建&#xff1a; RAG&#xff1a;

初识C++ · C++11(1)

目录 前言&#xff1a; 1 统一列表初始化 2 声明 2.1 auto 2.2 decltype 2.3 nullptr 2.4 stl的部分变化 3 右值引用和移动语义 前言&#xff1a; 在C11之前&#xff0c;C98的出现使得C看起来更像是一门独立的语言&#xff0c;C委员会成立后&#xff0c;对外宣称的是5…

神鸟云PCDN业务招募

短Z业务--支持nat0~nat4 省内调度&#xff0c;晚高峰 跑量9成 配置要求: 线路&#xff1a;单条上行30M 硬件&#xff1a;32线程 64内存条 240G系统盘 1G:2T固态盘单价&#xff1a;移动1900 电联2500 镜像下载&#xff1a;http://oss.download.birdicloud.com/box/Cent…

三层架构:IOCDI

三层架构 我们先看一下三层架构是什么 我们想要实现这三层架构的分离&#xff0c;实现一个类实现一个功能。 我们先建立一个包&#xff0c;然后在包下创建接口&#xff0c;然后再实现接口。从而实现三层架构分离。 IOC 为了实现这三层架构的分离&#xff0c;我们把创建类的…

协同过滤之矩阵分解算法问题详解

1、矩阵分解出现的原因 传统的协同过滤依赖用户的历史行为来推测用户对未评分商品的评分&#xff08;潜在兴趣&#xff09;&#xff0c;不需要了解物品的具体属性&#xff0c;也不需要知道用户的具体偏好&#xff0c;只需要历史评分数据就可以进行推荐&#xff0c;存在以下问题…

Query @azure/openai with images?

题意&#xff1a;使用图像与azure/openai进行交互或查询 问题背景&#xff1a; On chat.openai.com I can upload an image and ask chatgpt a question about it, with the existing openai and azure/openai api however there doesnt seem to be a way to do this? The Ch…

QT+ffmpeg环境配置

1.新建一个qt项目 2.下载ffmpeg文件Releases BtbN/FFmpeg-Builds GitHub 3.解压后&#xff0c;打开qt项目地址&#xff0c;将ffmpeg文件复制进qt项目 4.打开新建的qt项目头文件新加入如下内容&#xff1a;&#xff08;如有需求可按需求添加&#xff09; INCLUDEPATH $$PWD/i…

【多线程-从零开始-捌】阻塞队列,消费者生产者模型

什么是阻塞队列 阻塞队里是在普通的队列&#xff08;先进先出队列&#xff09;基础上&#xff0c;做出了扩充 线程安全 标准库中原有的队列 Queue 和其子类&#xff0c;默认都是线程不安全的 具有阻塞特性 如果队列为空&#xff0c;进行出队列操作&#xff0c;此时就会出现阻…

114套新闻网站源码+采集规则+安装使用教程-网络公司建站资源

运行环境 PHP5.6MYSQL5.6 – 系统版本支持WindowsLinux 源码介绍 1.版权问题 本114套新闻源码均由EYOUCMS系统二次开发而成&#xff0c;因为系统不涉及会员功能&#xff0c;所以没有版权纠纷问题&#xff0c;客户可以一直免费使用。 2.自动采集发布 系统自身集成了网易,新…

odoo17 翻译一个小bug

odoo17 翻译一个小bug 用户界面的没译过来 标红处&#xff0c;但在zh_CN.po中明显已经翻译过来了&#xff0c;采取暴力点的&#xff0c;直接把base下的base.pot删除&#xff0c;再更新一下&#xff0c;可以正常显示了

【区块链+社会公益】腾讯志愿者公益平台 | FISCO BCOS应用案例

由腾讯技术公益团队主导的“公益志愿者平台”&#xff0c;旨在链接公益组织和志愿者。公益组织入驻平台后可以发布公 益活动、征集志愿者&#xff0c;志愿者可以在平台报名参加公益活动、获得公益组织和平台联合颁发的志愿服务证书。 腾讯技术公益采用了微众区块链技术对 “公…

【Linux】网络编程套接字Scoket:UDP网络编程

目录 一、了解UDP协议 二、了解端口和IP地址 三、套接字概述与Socket的概念 四、Socket的类型 五、 Socket的信息数据结构 六、网络字节序与主机字节序的互相转换 七、地址转换函数 八、UDP网络编程流程及相关函数 socket函数 bind函数 recvfrom函数 sendto函数 …

网站开发涉及到的技术内容介绍——后端PHP(2)

网站开发涉及到的技术内容介绍——后端PHP(1)https://blog.csdn.net/xiaochenXIHUA/article/details/141000752?spm=1001.2014.3001.5501 一、PHP的常用函数 1.1、PHP文件夹的常用函数 PHP的目录常用函数 序号目录常用函数说明1$_SERVER[DOCUMENT_ROOT]获取到PHP项目的根目…

C++ -- 负载均衡式在线OJ (一)

一、项目宏观结构 1.项目功能 本项目的功能为一个在线的OJ&#xff0c;实现类似leetcode的题目列表、在线提交、编译、运行等功能。 2.项目结构 该项目一共三个模块&#xff1a; comm : 公共模块compile_server : 编译与运行模块oj_server : 获取题目列表&#xff0c;查看题…

Spring Boot项目缺少配置文件的解决方法:IDEA

本文介绍在IntelliJ IDEA软件中&#xff0c;为Spring Boot项目添加配置文件的操作方法。 最近&#xff0c;在IntelliJ IDEA软件中新创建了一个Spring Boot项目&#xff0c;是通过如下图所示的方法直接新建的。 但是&#xff0c;随后发现这样创建的Spring Boot项目没有配置文件。…

Threejs实现鼠标控制相机+键盘控制模型+点击指定点控制模型移动

1.前言 Threejs实现鼠标控制相机功能,键盘控制模型功能,点击指定点控制模型移动功能 键盘使用WASD控制模型移动效果图: 鼠标移动可控制相机的位置控制模型移动到指定点效果图: 2.功能拆分 根据以上效果图,可以得到以下三个主要实现的功能 鼠标移动可以使相机跟随通过键…

leetcode-121-买卖股票的最佳时机

原理&#xff1a; 核心原理&#xff1a; 如果我们真的在买卖股票&#xff0c;我们肯定会想&#xff1a;如果我是在历史最低点买入就好了&#xff01;该历史最低点是指卖出当天之前的历史最低点而不是全局最低点。 实现步骤&#xff1a; 1、初始化变量preprices[0]表示历史股…

20240809 每日AI必读资讯

乒乓球AI机器人赢了人类&#xff01;正反手灵活转换&#xff0c;擦网球高球都能接 - 谷歌发布首个达到人类竞技水平的机器人Agent&#xff0c;挑战乒乓球赛场。 - 机器人通过学习大量乒乓球状态数据&#xff0c;掌握了正手上旋球、反手瞄准等技能&#xff0c;展现出高速运动…

CTFHUB | web进阶 | PHP | Bypass disable_function | bypass iconv 2

开启题目 查看源码&#xff0c;发现可以蚁剑连接 进入之后无发现&#xff0c;使用插件 iconv 上传脚本 进入之后发现多了一个 .antproxy.php&#xff0c;复制文件名重新拼接连接 进入终端&#xff0c;查看根目录之后发现了有两个 flag 文件&#xff0c;之后发现了本题的 flag