Mysql数据库09——分组聚合函数

news2024/10/3 10:35:12

类似pandas里面的groupby函数,SQL里面的GROUP BY子句也是可以达到分组聚合的效果。

常用的聚合函数有COUNT(),SUM(),AVG(),MAX(),MIN(),其用法看名字都看的出来,下面一一介绍


聚合函数

COUNT()计数

统计student表中计科系学生的人数。

SELECT  COUNT(*) AS 计科系学生人数
FROM    student  WHERE   institute='计算机学院';

COUNT函数的参数都是星号(*),除了星号可以当COUNT函数的参数以外,字段名也可以当函数参数。当字段名作为函数参数时,如果该字段中没有NULL值,则与星号作函数参数的效果相同。而如果字段中含有NULL值,加上DISTINCT函数,则统计个数时会排除含有NULL值的记录,请看下面的例子。

从foreign_teacher表中,统计外籍教师的所有人数、拥有电话的人数和拥有email的教师人数。

SELECT  COUNT(*) AS 外籍教师总人数, COUNT(DISTINCT tel)  AS 有电话的人数,
COUNT(DISTINCT email)  AS 有email的人数  FROM    foreign_teacher

统计外籍教师中,没有email的教师人数。

分析:统计没有email的教师人数,其实就是在统计该字段上有几个NULL值。下面是具体的解决办法。

SELECT COUNT(*) AS 没有email的人数
FROM foreign_teacher 
WHERE email IS NULL;

 

 

使用SUM函数求某字段的和

在course表中,求所有课程的总学分。

求所有课程的总学分,就是把学分字段的所有数值累加起来,下面的语句完成了这一任务。

SELECT SUM(credit) AS 总学分 FROM course;

 

SUM函数不仅可以累加所有记录值以外,同COUNT函数一样,也可以只将满足条件的记录值累加起来,请看下面的例子。

在course表中,求课程类型为“必修”的课程的学分总和。

SELECT  SUM(credit)  AS  必修课的学分总和
FROM    course  WHERE   type='必修'  ;

 

 

从score表中,求“计算机基础”课的考试成绩总和。

分析:因为score表中只有课号,而并没有课名,因此,首先,需要从course表中,查找“计算机基础”课的课号,其次,才能从score表中,通过“计算机基础”课的课号,查找满足条件的记录,最后,将考试成绩通过SUM函数加起来得到总和。所以,下面使用了两条SELECT语句。

SELECT ID AS 计算机基础课号
FROM  course   WHERE course='计算机基础';

 

 

运行上面的查询语句后得到结果中显示了“计算机基础”课的课号为“004”,根据这一结果,从Score表中,求“计算机基础”课的考试成绩总和。

SELECT SUM(result1) AS 计算机基础总成绩 FROM score WHERE c_id='004';

 


使用AVG函数求某字段的平均值

数据库操作中,除了求字段和以外,还经常需要求字段的平均值。AVG函数用于求字段的平均值,其用法和SUM函数的用法基本相同。AVG函数的参数也必须是数值类型的字段名或者结果为数值的表达式。

从score表中,求“计算机基础”课的考试成绩的平均分。

SELECT AVG(result1) AS 计算机基础平均成绩  FROM  score
WHERE c_id IN (SELECT ID FROM course WHERE course="计算机基础");

 


使用MAXMIN函数求最大、最小值

MAX和MIN函数用于求指定字段中的最大值和最小值,例如,想要知道student表中,最早(最晚)的出生日期是多少时便可以用到MAX(MIN)函数。MAX和MIN两个函数可以用于文本类型、数值类型和日期时间类型的字段上。这两个函数都忽略含有NULL值的记录。下面通过例题学习这两个函数的用法。

从score表中,求“计算机基础”课的考试成绩的最高分和最低分。

SELECT MAX(result1) AS 最高分数,  MIN(result1) AS 最低分数 FROM score
WHERE c_id IN (SELECT ID FROM course WHERE course='计算机基础');

 

求年龄最小(出生日期最大)的学生的姓名,出生日期和所属院系。

SELECT name AS 姓名, birthday AS 出生日期, institute AS 所属院系
FROM student WHERE birthday IN (SELECT MAX(birthday) FROM student);

注意:WHERE子句后的条件表达式不能写成如下形式。

birthday= MAX(birthday),原因是,聚合函数不能出现在WHERE子句中。


统计汇总相异值(不同值)记录

数据库操作中,有时需要统计相异值记录,例如,统计Student表中的学生来自几个地区等。这时可以使用DISTINCT关键字完成统计任务。

统计student表中的学生来自几个地区。

分析:本例只要统计出不同来源地的个数即可。由于student表中的来源地字段中有重复值出现,因此,必须将重复值去掉,然后才能使用COUNT函数统计个数。

SELECT COUNT(DISTINCT(origin)) AS 地区个数 FROM student;

除COUNT函数可以使用DISTINCT以外,上面介绍的其它4个聚合函数中也能使用DISTINCT关键字。

SUM(),AVG(),MAX(),MIN()都是会忽略NULL值的。


数据分组

开始介绍groupby语句。

groupby用来查看一个分类变量有多少类会很快捷。

将student表中的数据,按所属院系字段分组。

SELECT   institute FROM     student GROUP BY institute;

这里需要说明的一点是,如果将上面的SELECT子句字段列表中的“institute”改为星号(*),则会产生一系列的错误 。

通过错误提示可以得到如下启示,如果查询语句带有GROUP BY子句,则SELECT子句中通常不单独使用星号通配符。如果非要单独使用星号通配符,则应当在GROUP BY子句中列出表的所有字段名,字段名之间用逗号分隔。不过这样会使GROUP BY子句失去它的作用。因为,此时并不是按单个字段分组,而是使用GROUP BY后列出的所有字段的组合分组。

如果SELECT子句后是字段名列表,而这些字段名又不在聚合函数中,则应当在GROUP BY子句中列出所有这些字段名。此时,需要注意的还是,分组是按GROUP BY后的所有字段的组合分组,而并非是按单个字段分组。例如“GROUP BY institute, name”表示只有某几个记录中的所属院系和姓名都相同时才把这些记录分为一组。


聚合函数与分组配合使用

将数据分成小组的的很大原因是用于统计汇总,而统计汇总通常都要使用聚合函数,因此,聚合函数和分组经常被人们放在一起使用。

统计student表中,男生的总人数和女生的总人数。

SELECT sex AS 性别, COUNT(*) AS 人数
FROM student GROUP BY sex;

 

统计student表中,每个院系的男生人数。

SELECT institute AS 所属院系, COUNT(*) AS 男生人数
FROM student WHERE sex="男" GROUP BY institute;

 GROUP BY子句中也可以有表达式,就是说可以按照表达式的结果分组数据。

为了方便查看哪一年雇佣了多少名外籍教师,在foreign_teacher表中按雇佣日期的年份统计人数。

SELECT YEAR(hiredate) AS 雇佣年份, COUNT(*) 雇用人数
FROM foreign_teacher GROUP BY YEAR(hiredate);

除COUNT函数以外,GROUP BY子句还可以与其它聚合函数配合使用,下面是SUM函数与GROUP BY子句配合使用的例子。

统计查询course表中必修课的学分总和与选修课的学分总和。

SELECT type AS 类型, SUM(credit) AS 学分总和
FROM course GROUP BY type;

 查询数据的直方图

 

直方图是表示不同实体之间数据相对分布的条状图。在一个查询语句中使用GROUP BY子句,不仅可以查询数据,又可以格式化数据生成图表。请看下面的例题。

从student表中,查询一个表示每个院系学生人数的直方图。

SELECT institute AS 所属院系, RPAD("",COUNT(*)*2,"=") AS 人数对比图
FROM student GROUP BY institute;

排序分组结果

如果想排序分组结果,则应当用使用ORDER BY子句。ORDER BY子句要放在GROUP BY子句的后面。实际上,ORDER BY子句要永远放在其它子句的后面。

在student表中,统计每个院系的学生人数,并按学生人数降序排序。

SELECT institute AS 所属院系, COUNT(*) AS 人数
FROM student GROUP BY institute  ORDER BY COUNT(*) DESC;

 

 


翻转查询结果

从student表中,查询每个院系的男生人数和女生人数。

SELECT institute AS 所属院系, sex AS 性别, COUNT(*) AS 人数
FROM student GROUP BY institute , sex ORDER BY institute;

 执行查询语句后得到的数据虽然正确无误,但是,当人们查看时会很不方便

在MySQL或SQL Server环境中,CASE表达式和GROUP BY子句联合使用会得到很多有用的数据表示,其中就包括反转查询结果的数据表示,请看下面的语句。

SELECT institute AS 所属院系, COUNT(CASE WHEN sex='男' THEN 1 ELSE NULL END) AS 男生人数,
COUNT(CASE WHEN sex='女' THEN 1 ELSE NULL END) AS 女生人数
FROM student GROUP BY institute;

 (其实就是类似pandas里面的.unstack()的用法,反解堆就行。)


使用HAVING子句设置分组查询条件

HAVING子句用于设置分组查询条件,即过滤不需要的分组。该子句通常和GROUP BY子句一起使用。单独使用HAVING子句没有太大的意义。

在student表中,统计计算机系和外语系的学生人数,并按学生人数降序排序。

SELECT institute AS 所属院系, COUNT(*) AS 人数
FROM student GROUP BY institute
HAVING institute IN('计算机学院','外语系')
ORDER BY COUNT(*);

 

另一种实现方式:用WHERE子句代替HAVING子句,其语句如下所示。

SELECT institute AS 所属院系, COUNT(*) AS 人数
FROM student WHERE institute IN('计算机学院','外语系')
GROUP BY institute ORDER BY COUNT(*);

 


HAVING子句与WHERE子句的区别

HAVING子句与WHERE子句之后都写条件表达式,而且都会根据条件表达式的结果筛选数据。但它们是有区别的,主要区别汇总如下。

1.HAVING子句用于筛选组,而WHERE子句用于筛选记录。
2.HAVING子句中可以使用聚合函数,而WHERE子句中不能使用聚合函数。
3.HAVING子句中不能出现既不被GROUP BY 子句包含,又不被聚合函数包含的字段。而WHERE子句中可以出现任意的字段。

通常,HAVING子句总是和GROUP BY 子句配合使用,而WHERE子句可以不用任何子句的配合。下面来看一个非常典型的例子,该例题只能用HAVING子句筛选条件。

统计score表中,考试总成绩大于450分的学生的信息。

SELECT s_id AS 学号, SUM(result1) AS 考试总成绩
FROM score GROUP BY s_id HAVING SUM(result1)>=450
ORDER BY 考试总成绩 DESC;

 

 本例,必须用HAVING子句指定筛选条件,因为只有HAVING子句中才能使用聚合函数,而WHERE子句中不能使用聚合函数。下面使用前面介绍过的一个例题,演示WHERE子句不能用HAVING子句代替的情况。

统计student表中,每个院系的男生人数。

SELECT institute AS 所属院系,COUNT(*) AS 男生人数
FROM student  WHERE sex='男' GROUP BY institute;


 

 

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

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

相关文章

基于nodejs+vue疫情网课管理系统

疫情网课也都将通过计算机进行整体智能化操作,对于疫情网课管理系统所牵扯的管理及数据保存都是非常多的,例如管理员:首页、个人中心、学生管理、教师管理、班级管理、课程分类管理、课程表管理、课程信息管理、作业信息管理、请假信息管理、上课签到管理、论坛交流…

企业微信应用授权,第一次不授权手机号后如何再次开启

文章目录前言一、关于企业微信应用授权1、新建一个应用2、企业微信应用授权二、第一次拒绝后如何手动开启总结前言 简单记录一下: 最近做了几个企业微信应用授权web,和普通微信公众号授权差不多,记录一下 一、关于企业微信应用授权 1、新建…

失手删表删库,赶紧跑路?!

在数据资源日益宝贵的数字时代公司最怕什么?人还在,库没了是粮库、车库,还是小金库?实际上,这里的“库”是指的数据库Ta是公司各类信息的保险柜小到企业官网和客户信息大到金融机构的资产数据和国家秘密即便没有跟数据…

Linux服务器开发-2. Linux多进程开发

文章目录1. 进程概述1.1 程序概览1.2 进程概念1.3 单道、多道程序设计1.4 时间片1.5 并行与并发1.6 进程控制块(PCB)2. 进程的状态转换2.1 进程的状态2.2 进程相关命令查看进程实时显示进程动态杀死进程进程号和相关函数3. 进程的创建-fork函数3.1 进程创…

抖音线索信息自动汇总到SeaTable流程搭建示例

每当抖音有新意向用户添加时,往往被企业视为意向客户,常需要运营人员查看后同步到SeaTable表单系统进行汇总,但运营人员时常会遗忘,并且难免会遗漏掉部分信息,导致部分意向客户无人跟进,最终流失。 那么&a…

GO语音-切片使用的雷区与性能优化相关

文章目录前言一、切片是什么?二、切片使用注意项1.避免复制数组2.切片初始化3.切片GC三、切片使用注意什么1. 大家来思考一个代码示例:2. 修改切片的值3. 降低切片重复申请内存总结前言 在 Go 语言中,切片(slice)可能是使用最为频繁的数据结…

数据结构 | 线性表

🔥Go for it!🔥 📝个人主页:按键难防 📫 如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀 📖系列专栏:数据结构与算法 &#x1f52…

Wise-IoU 作者导读:基于动态非单调聚焦机制的边界框损失

论文地址:Wise-IoU: Bounding Box Regression Loss with Dynamic Focusing Mechanism GitHub:https://github.com/Instinct323/wiou 摘要:目标检测作为计算机视觉的核心问题,其检测性能依赖于损失函数的设计。边界框损失函数作为…

153、【动态规划】leetcode ——416. 分割等和子集:滚动数组(C++版本)

题目描述 原题链接:1049. 最后一块石头的重量 II 解题思路 本题要找的是最小重量,我们可以将石头划分成两个集合,当两个集合的重量越接近时,相减后,可达到的装量就会是最小,此时本题的思路其实就类似于 4…

【光伏功率预测】基于EMD-PCA-LSTM的光伏功率预测模型(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

MSI_MSI-X中断之体验与使用

MSI_MSI-X中断之体验与使用 文章目录MSI_MSI-X中断之体验与使用1. 怎么发出MSI/MSI-X中断1.1 在RK3399上体验1.1.1 安装工具1.1.2 查看设备MSI-X信息1.1.3 验证MSI-X信息2. 怎么使用MSI/MSI-X3. MSI/MSI-X中断源码分析3.1 IRQ Domain创建流程3.1.1 GIC3.1.2 ITS3.1.3 PCI MSI3.…

【Flutter】【Unity】使用 Flutter + Unity 构建(AR 体验工具包)

使用 Flutter Unity 构建(AR 体验工具包)【翻译】 原文:https://medium.com/potato/building-with-flutter-unity-ar-experience-toolkit-6aaf17dbb725 由于屡获殊荣的独立动画工作室 Aardman 与讲故事的风险投资公司 Fictioneers&#x…

最大公约数:常用的四大算法求解最大公约数,分解质因数法、短除法、辗转相除法、更相减损法。

常用的四大算法求解最大公约数,分解质因数法、短除法、辗转相除法、更相减损法。 (本文获得CSDN质量评分【91】)【学习的细节是欢悦的历程】Python 官网:https://www.python.org/ Free:大咖免费“圣经”教程《 python 完全自学教程》&#x…

网络基础-虚拟化工具-网桥

系列文章目录 本系列文章主要是回顾和学习工作中常用的网络基础命令,在此记录以便于回顾。 该篇文章主要是讲解虚拟化的工具网桥相关的概念和常用命令 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录系…

C++之多态【详细总结】

前言 想必大家都知道面向对象的三大特征:封装,继承,多态。封装的本质是:对外暴露必要的接口,但内部的具体实现细节和部分的核心接口对外是不可见的,仅对外开放必要功能性接口。继承的本质是为了复用&#x…

MySQL(主从、半同步、组复制、MHA高可用)

文章目录一、MySQL源码编译以及初始化二、mysql主从复制、半同步MySQL组复制MySQL读写分离MHA高可用一、MySQL源码编译以及初始化 源码编译使用cmake,所以要提前安装cmake,完成之后make install即可 这里要创建mysql用户,以及用普通用户方式…

电子秤专用模拟数字(AD)转换器芯片HX711介绍

HX711简介HX711是一款专为高精度电子秤而设计的24 位A/D 转换器芯片。与同类型其它芯片相比,该芯片集成了包括稳压电源、片内时钟振荡器等其它同类型芯片所需要的外围电路,具有集成度高、响应速度快、抗干扰性强等优点。降低了电子秤的整机成本&#xff…

分享112个JS菜单导航,总有一款适合您

分享112个JS菜单导航,总有一款适合您 112个JS菜单导航下载链接:https://pan.baidu.com/s/1Dm73d2snbu15hZErJjTXxg?pwdfz1c 提取码:fz1c Python采集代码下载链接:https://wwgn.lanzoul.com/iKGwb0kye3wj base_url "h…

【游戏逆向】RPG游戏背包镶嵌系统分析

镶嵌系统是很多3D游戏都有的功能,玩家可以向镶嵌槽内附加宝石来提升装备的属性,这也直接提升了物品的价值。在一些扫拍卖和摆摊的外挂中经常利用这个属性来低价购入高价值装备。以这款游戏为例,我们来对装备上的镶嵌槽和镶嵌宝石进行分析。 …

Nacos,一款非常优秀的注册中心(附视频)

Nacos 核心源码精讲 - IT贱男 - 掘金小册全方位源码精讲,深度剖析 Nacos 注册中心和配置中心的核心思想。「Nacos 核心源码精讲」由IT贱男撰写,375人购买https://s.juejin.cn/ds/BuC3Vs9/ 先简单说两句 你好,很高兴你能够点开本小册&#x…