MySQL_表_进阶(2/2)

news2024/11/17 11:29:05

上一章我们谈了排序子句,使用ORDER BY 字段 DESC/ASC。以及左右连接的多关系查询。

今天,没错,四张表最后两个需求 ✨涉及聚合函数查询与指定别名


四张表:

  学院表:(testdb.dept)

课程表:(testdb.course)

选课表:(testdb.sc)

学生表 :(testdb.stu)

需求如下:

  1. 查询每个学生的总成绩,显示学号、姓名、总成绩,列名以中文显示。
  2. 查询每门课程的选课人数,显示课程编号、课程名称、选课人数,没有学生选的课程也要显示,按选课人数降序排列。(提示:选课人数需要计算)

 需求一:

 查询每个学生的总成绩,显示学号、姓名、总成绩,列名以中文显示。

 我们看到一个要求,也算闻所未闻:列名以中文显示。A,你发现,原来查询出来的结果表还可以自己命名列名。

这其实是对字段的取别名操作:

“列名以中文显示”——给字段名指定别名

我们在SELECT 语句后往往加上我们想要的字段,这时候,往往结果查出来的列表头就是字段名。

比如:我们查询学号为“2022121001”的学生的选课信息,要求显示他的学号,姓名和所选课程编号。

SELECT sc.stuid,stuname,cid
FROM testdb.sc
JOIN testdb.stu
ON stu.stuid = sc.stuid AND sc.stuid = '2022121001';
#因为stuname属于stu表,所以需要联合查询
#一连就发现,两张表都有stuid这个字段,因此,每个stuid前都需要加前缀。

最后显示的结果:

 

你可以看到,列表头,就是我们刚刚select语句要求显示的字段名:stuid,stuname,cid。

有些时候,为了更好的理解显示的信息,我们会为显示的字段指定别名。你想,stuid我若是原先不说是学生学号,其实是要反应时间的。取成中文,理解成本就会大大降低。

怎么取呢?

SELECT 字段 AS 别名
FROM ...
....

刚刚,显示的学生学号,姓名,课程编号,我全部取别名就是这样:

SELECT sc.stuid AS 学号,stuname AS 姓名,cid AS 选课课程号
FROM testdb.sc
JOIN testdb.stu
ON stu.stuid = sc.stuid AND sc.stuid = '2022121001';

效果如下:

需求分析:

显示学号,姓名没问题,就是这个总成绩......看起来有点问题,testdb.sc表(选课表)是有score(成绩)这个字段,但不是总成绩。

要显示总成绩,按照我们自己的逻辑:我们会把相同学号的几行合成一行,然后行的最后显示几个score的总和,这个总和就是他们的总成绩。

比如:学号2022121004这个同学,下表中他有两行记录,那么最后显示的结果,学号 姓名 总成绩

2022121004 李四 188

这个188就是把学号都是2022121004的score记录都加起来的

 选课表:(testdb.sc)

对于这种,SQL内部提供了许多聚合函数: 

常见的聚合函数
函数名称功能
AVG按列计算平均值
SUM按列计算值的总和
MAX求一列中的最大值
MIN求一列中的最小值
COUNT按列值统计个数

我们这里要计算“总成绩”,明显是要用这里的SUM,但是这个“按列”,就很有说法了。

按谁的列,按照什么来划分?

我们要求显示,每个同学的总成绩,testdb.sc(选课表)表里体现同学的,就只有stuid(学号)。那得出结论:按照相同的学号来分组,每个组内都使用聚合函数(此处是sum),得到就是每个同学的总成绩。

分组的关键字:GROUP BY 加字段名(作为分组的依据)

代码就是这样写的:

SELECT sc.stuid AS 学号,stuname AS 姓名,SUM(score) AS 总成绩
FROM testdb.sc
#这里的总成绩调用的聚合函数,函数自然是需要参数,传进去的就是单个成绩
#主要的表还是sc表,但是stuname这个字段是来自stu表,还需要联合
GROUP BY sc.stuid
#按照学生学号来分组,相同学号的不同学科成绩进行聚合,就是咱们的总成绩

 添加联合查询:

SELECT sc.stuid AS 学号,stuname AS 姓名,SUM(score) AS 总成绩
FROM testdb.sc
JOIN testdb.stu
ON stu.stuid = sc.stuid
GROUP BY sc.stuid;

所以,这个需求的代码就如上显示。

需求二:

查询每门课程的选课人数,显示课程编号、课程名称、选课人数,没有学生选的课程也要显示,按选课人数降序排列。(提示:选课人数需要计算)

这怎么也算咱们最后一个需求,这里咱们换个思路:这次真正的先写框架——把学过的都用起来

SELECT cid,cname,选课人数
FROM testsdb.sc
#说“选课人数”,姑且就从sc表选

这里的选课人数,应该就是数有多少个学生,sc表中使用stuid来代表一个学生。我们使用COUNT这个计数函数。

SELECT cid,cname,COUNT(stuid)
FROM testsdb.sc
#这里迟迟定不下cid前面的前缀,是因为course表也有这个字段,最后再来补充也不迟

 因为cname这个字段属于course表,所以这里还需要联合查询。但是联合查询:有普通的JOIN,亦有左右连接,你又该怎么选呢?

SELECT cid,cname,COUNT(stuid)
FROM testsdb.sc
JOIN testdb.course
ON course.cid = sc.cid
#连表的条件还是相同的字段就行

继续读题: "没有学生选的课程也要显示"。我们这里若只是简单地使用默认的JOIN查询,它能达到的效果只是匹配两表都存在,返回两个表中有匹配的行。

若使用JOIN连接,一些course表里有的课程,但是在sc里没有被学生选(也就是说,sc表里没有记录)。这种课程,是无法匹配的,最后的结果也不会保留这种没被选的课的记录。

我们为了保持某一张的完整性,往往会采取左右连接,选出主表。这里既然要保证所有课程信息都在,那么,那张被保存下来的表应该就是course表。破案了,所以在上述代码,应该有右连接course表。

SELECT cid,cname,COUNT(stuid)
FROM testsdb.sc
RIGHT JOIN testdb.course
ON course.cid = sc.cid

现在来分组,既然是每个课程的选课人数,分组条件就是课程 ——把选同一门课程的stuid分为一组,COUNT函数对stuid进行计数,得到的结果就是该门课的选课人数。

SELECT cid,cname,COUNT(stuid)
FROM testsdb.sc
RIGHT JOIN testdb.course
ON course.cid = sc.cid
GROUP BY course.cid
#cid的前缀在确定主表的那一刻就注定了:在sc表可能并不存在,但是course里是一定有的。一旦两表的cid匹配不上,sc.cid会为NULL,但course.cid始终有效

注意:GROUP BY子句里面的分组字段,应该是尽力包含所有的SELECT语句的字段(聚合函数除外)。

不同的课程id也有其对应的课程名称cname,将它俩都作为分组条件,才是最推荐(原则上,是视具体问题而定)。你想,条件越细化,其结果的偏差就会越小。

所以,GROUP BY子句里面应该包含SELECT 语句的cid, 它俩具有绑定性。既然course.cid在course(主表)能保证数据的完整和有效,GROUP BY里使用course.cid,那SELECT 里的cid也应该来自testdb.course。

SELECT course.cid,cname,COUNT(stuid)
FROM testsdb.sc
RIGHT JOIN testdb.course
ON course.cid = sc.cid
GROUP BY course.cid

小总结: 

本节重点:聚合函数 指定显示字段别名

需求一参考代码:

#查询每个学生的总成绩,显示学号、姓名、总成绩,列名以中文显示。
SELECT sc.stuid AS 学号,stuname AS 姓名,SUM(score) AS 总成绩
FROM testdb.sc
JOIN testdb.stu
ON stu.stuid = sc.stuid
GROUP BY sc.stuid;

 需求二参考代码:

#查询每门课程的选课人数,显示课程编号、课程名称、选课人数,没有学生选的课程也要显示,按选课人数降序排列。(提示:选课人数需要计算)
SELECT course.cid,cname,COUNT(stuid)
FROM testsdb.sc
RIGHT JOIN testdb.course
ON course.cid = sc.cid
GROUP BY course.cid

这次的左右连接的实践,相信你又对其应用的了解更上一层楼,四张表的应用——从创建表、到数据的增删查改,终于...OVER了(🍵)但是,对表的细节学习,我们不会停下,毕竟:

学无止境也,然则问可少耶

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

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

相关文章

MT5016A-ASEMI三相整流桥MT5016A

编辑:ll MT5016A-ASEMI三相整流桥MT5016A 型号:MT5016A 品牌:ASEMI 封装:D-63 批号:2024 类型:三相整流桥 电流(ID):50A 电压(VF):1600V 安装方式&a…

示例说明:elasticsearch实战应用

Elasticsearch 是一个基于 Lucene 的分布式搜索和分析引擎,广泛应用于日志分析、全文搜索、数据可视化等领域。以下是 Elasticsearch 实战应用的一些关键点和步骤: 1. 环境搭建 首先,你需要在你的环境中安装和配置 Elasticsearch。 安装 E…

K8S精进之路-控制器StatefulSet有状态控制 -(2)

状态说明 在进行StatefulSet部署之前,我们首先可能要了解一下,什么是"有状态应用"和"无状态应用"。无状态应用就是pod无论部署在哪里,在哪台服务器上提供服务,都是一样的结果,比如经常用的nginx。…

Django5 使用pyinstaller打包成 exe服务

首先:确保当前的django项目可以完美运行,再进行后续操作 python manage.py runserver第一步 安装 pyinstaller pip install pyinstaller第二步 创建spec 文件 pyinstaller --name manage --onefile manage.pypyinstaller:这是调用 PyInsta…

SpringBoot 流式输出时,正常输出后为何突然报错?

一个 SpringBoot 项目同时使用了 Tomcat 的过滤器和 Spring 的拦截器&#xff0c;一些线程变量在过滤器中初始化并在拦截器中使用。 该项目需要调用大语言模型进行流式输出。 项目中&#xff0c;笔者使用 SpringBoot 的 ResponseEntity<StreamingResponseBody> 将流式输…

【YOLO目标检测马铃薯叶病害数据集】共1912张、已标注txt格式、有训练好的yolov5的模型

目录 说明图片示例 说明 数据集格式&#xff1a;YOLO格式 图片数量&#xff1a;1912 标注数量(txt文件个数)&#xff1a;1912 标注类别数&#xff1a;5 标注类别名称&#xff1a; health General early blight Severe early blight General late blight Severe late bligh…

Vue3使用vue-quill富文本编辑器实现图片大小调整

安装uill-image-resize npm install quill-image-resize --save在项目中导入并注册插件 import { QuillEditor, Quill } from vueup/vue-quill; import ImageUploader from quill-image-uploader; import ImageResize from quill-image-resize; //导入插件 import vueup/vue-…

webservice xfire升级为cxf cxf常用注解 cxf技术点 qualified如何设置

关键点 确保参数名称保持一致确保参数命名空间保持一致确保接口命名空间保持一致确保请求头设置正确确保用soapui工具解析的参数结构一致 cxf常用注解 定义接口用到的注解 定义接口名称&#xff0c;和接口命名空间 WebService(name“ams” ,targetNamespace “http://ifac…

海山数据库(He3DB)+AI(五):一种基于强化学习的数据库旋钮调优方法

[TOC] 0 前言 在海山数据库(He3DB)AI&#xff08;三&#xff09;中&#xff0c;介绍了四种旋钮调优方法&#xff1a;基于启发式&#xff0c;基于贝叶斯&#xff0c;基于深度学习和基于强化学习。本文介绍一种基于强化学习的旋钮调优方法&#xff1a;QTune: A Query-Aware Dat…

回归预测 | Matlab基于SO-ESN蛇群算法优化回声状态网络多输入单输出回归预测

回归预测 | Matlab基于SO-ESN蛇群算法优化回声状态网络多输入单输出回归预测 目录 回归预测 | Matlab基于SO-ESN蛇群算法优化回声状态网络多输入单输出回归预测预测效果基本描述程序设计参考资料 预测效果 基本描述 1.蛇群算法(SO)优化回声状态网络做拟合回归预测&#xff0c;…

Spring Security - 用户授权

1.用户授权介绍&#xff1a; 在SpringSecurity中&#xff0c;会使用默认的FilterSecurityInterceptor来进行权限校验。在FilterSecurityInterceptor中会从SecurityContextHolder获取其中的Authentication&#xff0c;然后获取其中的权限信息。判断当前用户是否拥有访问当前资源…

汉口银行IPO之路再添坎坷:多名股东甩卖股权,内控是“老大难”

撰稿|芋圆 近日&#xff0c;总部设在武汉的商业银行——汉口银行股份有限公司&#xff08;以下简称“汉口银行”&#xff09;的股权再现交易信息&#xff0c;先后“亮相” 上海联合产权交易所、北京产权交易所&#xff0c;出售股权的股东包括中国电信以及中国移动全资子公司等…

神经网络(五):U2Net图像分割网络

文章目录 一、网络结构1.1第一种block结构1.2第二种block结构1.3特征图融合模块1.4损失函数1.5总体网络架构1.6代码汇总1.7普通残差块与RSU对比 二、代码复现 参考论文&#xff1a;U2-Net: Going deeper with nested U-structure for salient object detection   这篇文章基于…

从销售到 AI 算法工程师 | 转行人工智能大模型(含面经裁员幸存指南)

我叫王东&#xff0c;90后&#xff0c;和大家分享一下我的人工智能转型之路。 农学毕业&#xff0c;投身互联网做销售 机遇难求&#xff0c;养殖梦碎 我是土生土长的农村人&#xff0c;小时候经常和小鱼小虾打交道&#xff0c;上大学的时候就选择了农学专业&#xff0c;想着…

qmt量化交易策略小白学习笔记第67期【qmt编程之获取ETF申赎清单】

qmt编程之获取ETF申赎清单 qmt更加详细的教程方法&#xff0c;会持续慢慢梳理。 也可找寻博主的历史文章&#xff0c;搜索关键词查看解决方案 --获取ETF申赎清单&#xff01; 实盘或回测qmt&#xff0c;可关注博主咨询~ ETF申赎清单 提示 使用前需要调用xtdata.download_…

JDBC 事务

文章目录 准备数据JDBC操作事务API介绍案例代码小结 准备数据 # 创建一个表&#xff1a;账户表. create database day05_db; # 使用数据库 use day05_db; # 创建账号表 create table account(id int primary key auto_increment,name varchar(20),money double ); # 初始化数据…

如何管理自己的工作任务和时间

在当今快节奏的工作环境中&#xff0c;有效地管理工作任务和时间是取得成功和保持工作生活平衡的关键。以下是一些实用的方法&#xff0c;可以帮助你更好地掌控自己的工作。 一、明确工作任务 1、制定任务清单 每天开始工作前&#xff0c;列出当天需要完成的所有任务。可以使用…

PWA(Progressive web APPs,渐进式 Web 应用)

文章目录 引言I 什么是 PWA功能特性II Web 应用清单引言 PWA 是 Google 于 2016 年提出的概念,于 2017 年正式落地,于 2018 年迎来重大突破,全球顶级的浏览器厂商,Google、Microsoft、Apple 已经全数宣布支持 PWA 技术。 PWA 目的是通过各种 Web 技术实现与原生 App 相近…

Java读取YAML文件

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storm…

基于注意力机制的图表示学习:GRAPH-BERT模型

人工智能咨询培训老师叶梓 转载标明出处 图神经网络&#xff08;GNNs&#xff09;在处理图结构数据方面取得了显著的进展&#xff0c;但现有模型在深层结构中存在性能问题&#xff0c;如“悬挂动画问题”和“过平滑问题”。而且图数据内在的相互连接特性限制了大规模图输入的并…