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

news2024/12/24 19:11:29

目录

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.1.1 ①取相关表笛卡尔积 

2.1.2 ②确定连接条件,过滤无效数据

2.1.3 ③精简查询结果

2.1.3.1 表的别名

3、综合练习

3.1 问题一

3.2 问题二

3.3 问题三(三表查询)


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 内连接

内连接有两种语法形式:

大家可选择自己习惯的语法使用。

2.1.1 ①取相关表笛卡尔积 

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

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

执行SQL取笛卡尔积:

2.1.2 ②确定连接条件,过滤无效数据

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

联合的表之间必然存在主外键关系,通过主外键值确定连接条件。判断子表外键值和主表主键值是否相等即可,保留相等的,过滤不相等的。

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

2.1.3 ③精简查询结果

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

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

2.1.3.1 表的别名

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


3、综合练习

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

班级表:

课程表:

成绩表:

学生表:

3.1 问题一

查询许仙同学的成绩:

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

3.2 问题二

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

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

3.3 问题三(三表查询)

查询所有同学各门课的成绩,以及学生信息:

解题关键点在于:确定三个表之间的连接条件


END

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

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

相关文章

机器学习——全连接(MLP多层感知机)的理解

全连接即是矩阵乘&#xff0c;因此在transformer中获取QKV理论上是输入与QKV权重矩阵相乘&#xff0c;但实际操作则是使用全连接即nn.Linear()&#xff0c;注意这里的输入和输出都是二维的[batch,d_model]&#xff0c;即每个样本是一维的。

【Echarts】custom自定义图表实现甘特图

效果图 主要注意点&#xff1a; 1、右上角图例visualMap实现 2、visualMap增加formatter 3、series使用custom自定义图表&#xff0c;encode解析四维数组。核心是renderItem方法&#xff0c;必填项&#xff0c;且需要注意要全部定义在options里面&#xff01;&#xff01;&…

程序员如何平衡日常编码工作与提升式学习?

程序员的两难&#xff1a;如何平衡日常编码与持续学习 在科技日新月异、更新迭代迅速的编程世界中&#xff0c;程序员面临的一个重要挑战是如何在繁忙的日常编码工作和持续的专业提升之间找到平衡。是否应当在工作时间全身心投入到项目推进中&#xff0c;还是应该抽出时间学习…

第38篇 冒泡排序<二>

Q&#xff1a;如何设计C语言程序对数组进行降序排列&#xff1f; A&#xff1a;基本原理&#xff1a;通过不断的比较和交换数组中的数据元素&#xff0c;最终使得最大的数据“冒泡”排到到数组最末&#xff0c;并逐步缩小待排序的范围直到所有数据都排列正确位置。首先定义简单…

行业大模型:信用评分大模型、生产优化大模型、库存管理大模型、物流行业大模型、零售行业大模型

金融行业大模型&#xff1a;信用评分大模型 信用评分模型在金融行业中扮演着至关重要的角色&#xff0c;它通过对个人或企业的信用状况进行评估&#xff0c;帮助金融机构有效控制风险&#xff0c;提高业务效率。以下是信用评分模型的特点及案例介绍&#xff1a; 信用评分模型…

git放弃本地add/commit

git放弃本地add/commit 还未添加add的情况已经执行git add缓存了的&#xff1a;可以用命令 还未添加add的情况 # 放弃某个文件git checkout <filename># 放弃所有文件git checkout .已经执行git add缓存了的&#xff1a;可以用命令 git reset HEAD filepathname &#x…

【开端】如何高效记录并整理编程学习笔记

如何高效记录并整理编程学习笔记&#xff1f; 在编程学习的海洋中&#xff0c;高效的笔记记录和整理方法就像一张珍贵的航海图&#xff0c;能够帮助我们在浩瀚的知识中找到方向。如何建立一个既能快速记录又易于回顾的笔记系统&#xff1f;如何在繁忙的学习中保持笔记的条理性…

巴黎奥运会中国奖牌数据分析

目录 一、每个比赛日奖牌变化数据分析 二、奖牌项目占比数据分析 2.1金牌中项目占比分析 2.2 银牌中项目占比分析 2.3 铜牌中项目占比分析 2.4 奖牌总数中项目占比分析 在巴黎奥运会上&#xff0c;中国队的表现可谓亮眼&#xff0c;各项比赛日的奖牌总数和不同项目的奖牌…

【软件测试】功能测试理论基础

目录 项目的测试流程&#x1f3f4; 需求评审 评审形式 测试人员在需求评审中职责 测试计划与方案 测试计划 问题 测试方案&#x1f3f4; 测试计划与方案的对比 功能测试设计&#x1f3f4; 测试设计的步骤 项目的测试流程&#x1f3f4; 作用&#xff1a; 有序有效开展…

js 深拷贝、浅拷贝深度解析

赋值操作&#xff1a; let obj{a:1,b:[1,2,3],c:{m:2}}let newObjobjnewObj.a2newObj.b.push(4)newObj.c.m3console.log(obj,newObj); 将一个对象赋值给一个变量&#xff0c;其实就是将这个对象在栈内存中的引用地址复制给了这个变量&#xff0c;这两个对象指向堆内存中的同一个…

基于SpringBoot+Vue的产业园区智慧公寓管理系统(带1w+文档)

基于SpringBootVue的产业园区智慧公寓管理系统(带1w文档) 基于SpringBootVue的产业园区智慧公寓管理系统(带1w文档) 当前的网络技术&#xff0c;软件技术等都具备成熟的理论基础&#xff0c;市场上也出现各种技术开发的软件&#xff0c;这些软件都被用于各个领域&#xff0c;包…

Multisim 用LM358 运放模拟线性稳压器 - 运放输出饱和 - 前馈电容

就是拿运放搭一个可调的LDO 稳压器&#xff0c;类似下面这个功能框图里的感觉。本来应该非常简单&#xff0c;没什么好说的&#xff0c;没想到遇到了两个问题。 原理 - 理想运放 我用PNP 三极管Q2 作为输出&#xff0c;运放输出电压升高时&#xff0c;流过PNP 三极管BE 的电流变…

【proteus经典实战】报警器与旋转灯

一、简介 报警器与旋转灯项目是一个典型的嵌入式系统应用&#xff0c;它结合了声音报警和视觉指示功能&#xff0c;广泛应用于安全监控、紧急疏散、交通信号和娱乐设备等多种场景。基于51单片机提供一种集成的声音和视觉报警解决方案&#xff0c;通过声音和灯光的结合&#xff…

12 中断

12 中断 1、内核中断编程2、顶半部和底半部机制2.1 任务的相关概念2.1.1 分类2.1.2 优先级2.1.3 进程调度2.1.4 休眠sleep 2.2 顶半部和底半部实现机制2.2.1 顶半部特点2.2.2 底半部特点2.2.3 底半部实现方法之:tasklet2.2.4 底半部实现机制之工作队列2.2.5 底半部实现机制之软…

微信会员卡怎么做_便捷生活新风尚

在这个快节奏的时代&#xff0c;每一次消费不仅是简单的商品交换&#xff0c;更是一场关于个性、便捷与尊享的深刻体验。随着数字化浪潮的汹涌澎湃&#xff0c;微信会员卡应运而生&#xff0c;它以独特的魅力&#xff0c;重新定义了商家与顾客之间的关系&#xff0c;开启了一场…

网鼎杯-2018-Web-Unfinish

先尝试万能注入&#xff1a; 如果万能注入缺少符号&#xff0c;如果加符又进不去&#xff0c;那我们尝试扫描文件,然后发现有一个register.php的文件&#xff0c;应该是注册页面&#xff0c;我们去打开 知道存储的文件&#xff0c;并利用状态码进行过滤 我们注册的用户名就是aa…

鼠害监测系统:科技守护农业安全

在农业生产中&#xff0c;鼠害一直是威胁作物安全、影响产量的重要因素。然而&#xff0c;随着科技的飞速发展&#xff0c;鼠害监测系统正逐步成为现代农业防治鼠害的重要利器。 鼠害监测系统巧妙融合了现代光电、数控及物联网技术&#xff0c;实现了诱鼠、投喂鼠药、鼠情监测及…

RoBERTa-www-ext 解读及使用方法

背景&#xff1a;模型及名字 hfl/chinese-roberta-wwm-ext 是 Hugging Face 提供的一个中文预训练模型&#xff0c;它是 RoBERTa 的一个变种&#xff0c;特别针对中文进行了优化。这个模型的名称中的“wwm”代表“word-level whole word masking”&#xff0c;意味着在预训练过…

爬虫案例3——爬取彩票双色球数据

简介&#xff1a;个人学习分享&#xff0c;如有错误&#xff0c;欢迎批评指正 任务&#xff1a;从500彩票网中爬取双色球数据 目标网页地址&#xff1a;https://datachart.500.com/ssq/ 一、思路和过程 目标网页具体内容如下&#xff1a; ​​​​​ 我们的任务是将上图中…

数学建模——启发式算法(蚁群算法)

算法原理 蚁群算法来自于蚂蚁寻找食物过程中发现路径的行为。蚂蚁并没有视觉却可以寻找到食物&#xff0c;这得益于蚂蚁分泌的信息素&#xff0c;蚂蚁之间相互独立&#xff0c;彼此之间通过信息素进行交流&#xff0c; 从而实现群体行为。 蚁群算法的基本原理就是蚂蚁觅食的过程…