MySQL 实验 10:数据查询(3)—— 聚合函数与分组查询

news2024/10/8 13:36:38

MySQL 实验 10:数据查询(3)—— 聚合函数与分组查询

目录

  • MySQL 实验 10:数据查询(3)—— 聚合函数与分组查询
    • 一、聚合函数
        • 1、计数函数(COUNT)
        • 2、求和函数(SUM)
        • 3、求平均值函数(AVG)
        • 4、求最大值函数(MAX)
        • 5、求最小值函数(MIN)
        • 6、连接数据值函数(GROUP_CONCAT)
    • 二、分组查询
        • 1、GROUP BY 的语法
        • 2、使用列名分组
        • 3、使用表达式分组
        • 4、分组的同时使用 WHERE 子句
        • 5、使用 HAVING 对分组进行选择
        • 6、WITH ROLLUP 参数

聚合函数又称为统计函数,可以对查询结果进行统计和汇总,对表中某一列的数据值进行计算并返回一个单一值。

使用 GROUP BY 关键字可以将查询结果按照一个或多个列或者表达式进行分组,分组的依据为 GROUP BY 后面的列名或表达式。GROUP BY 通常与聚合函数合用。

一、聚合函数

常用的聚合函数包括 SUM、COUNT、AVG、MAX 和 MIN,实现对表中数据的统计,GROUP_CONCAT 函数的功能与聚合函数类似,可以对某一列中的数据值进行连接操作。聚合函数的语法格式如下:

-- 1、计数函数(count):使用 count(*) 时不忽略 NULL 值,使用 count(列名|表达式) 时忽略 NULL 值
-- 使用 distinct 可以去除重复数据
COUNT(distinct *|列名|表达式)

-- 2、求和函数(sum):列的类型或表达式返回值的类型必须是数值类型
SUM(列名|表达式)

-- 3、求平均值函数:列的类型或表达式返回值的类型必须是数值类型
AVG(列名|表达式)

-- 4、求最大值函数:列的类型或表达式返回值的类型可以是任意类型
MAX(列名|表达式)

-- 5、求最小值函数:列的类型或表达式返回值的类型可以是任意类型
MIN(列名|表达式)

-- 6、连接数据值函数:列的类型或表达式返回值的类型可以是任意类型
-- 使用 separator 指定数据之间的分隔符,如果省略 separator,则默认的分隔符为逗号
-- 使用 distinct 可以去除重复数据
GROUP_CONCAT([distinct] 列名 separator '分隔符')

说明:

(1)如果查询中使用了聚合函数,在没有分组的情况下,查询结果只有一行(只有一个统计结果)。如果使用 GROUP BY 分组,则每一个分组有一个统计结果。

(2)如果查询中使用了聚合函数,在没有分组的情况下,SELECT 后面除了聚合函数之外,一般不能有列名。

1、计数函数(COUNT)

使用 COUNT( ) 函数用于统计记录数量,通常与 GROUP BY 子句合用。

语法格式如下:

COUNT(distinct *|列名|表达式)

-- 说明:使用 count(*) 时不忽略 NULL 值,使用 count(字段|表达式) 时忽略 NULL 值

例如:

(1)统计学生人数

mysql> select count(*) stu_cnt from stu;
+---------+
| stu_cnt |
+---------+
|      14 |
+---------+
1 row in set (0.00 sec)

(2)统计学生所在院系的数量

mysql> select count(distinct dept_id) as dept_cnt from stu;
+----------+
| dept_cnt |
+----------+
|        4 |
+----------+
1 row in set (0.00 sec)

(3)统计女生人数

mysql> select count(1) stu_cnt from stu where gender='女';
+---------+
| stu_cnt |
+---------+
|       6 |
+---------+
1 row in set (0.00 sec)
2、求和函数(SUM)

使用 SUM( ) 函数可以对表中某一列的数据求和,统计时忽略 NULL 值。如果没有匹配行,则返回 NULL 值。常与 GROUP BY 子句合用。语法格式如下:

SUM(字段|表达式)

-- 说明:列的类型或表达式返回值的类型必须是数值类型

例如:

(1)统计学号为【20220124002】的同学选修的所有课程的总分

mysql> select sum(score) total_score from xk where s_id='20220124002';
+-------------+
| total_score |
+-------------+
|      226.00 |
+-------------+
1 row in set (0.00 sec)

(2)统计女生人数

mysql> select sum(1) stu_cnt from stu where gender='女';
+---------+
| stu_cnt |
+---------+
|       6 |
+---------+
1 row in set (0.00 sec)

(3)统计男生人数

mysql> select sum(if(gender='男',1,0)) stu_cnt from stu;
+---------+
| stu_cnt |
+---------+
|       8 |
+---------+
1 row in set (0.00 sec)
3、求平均值函数(AVG)

使用 AVG( ) 函数可以计算表中某一列数据的平均值。统计时忽略 NULL 值。常与 GROUP BY 子句合用。语法格式如下:

AVG(字段|表达式)

-- 说明:列的类型或表达式返回值的类型必须是数值类型

例如:

(1)统计学号为【20220124002】的同学选修的所有课程的平均分

mysql> select avg(score) avg_score from xk where s_id='20220124002';
+-------------+
| avg_score   |
+-------------+
|   75.333333 |
+-------------+
1 row in set (0.00 sec)

(2)统计学生的平均年龄

mysql> select avg(year(now())-year(birth)) avg_age from stu;
+---------+
| avg_age |
+---------+
| 22.0714 |
+---------+
1 row in set (0.00 sec)
4、求最大值函数(MAX)

使用 MAX( ) 函数统计某一列数据的最大值。统计时忽略 NULL 值。常与 GROUP BY 子句合用。语法格式如下:

MAX(字段|表达式)

-- 说明:列的类型或表达式返回值的类型可以是任意类型

例如:

(1)查询所有学生的最大年龄

mysql> select max(year(now())-year(birth)) max_age from stu;
+---------+
| max_age |
+---------+
|      24 |
+---------+
1 row in set (0.00 sec)

(2)查询编号为【C01002】的课程的最高分

mysql> select max(score) max_score from xk where c_id='C01002';
+-----------+
| max_score |
+-----------+
|     69.00 |
+-----------+
1 row in set (0.00 sec)
5、求最小值函数(MIN)

使用 MIN( ) 函数统计某一列数据的最小值。统计时忽略 NULL 值。常与 GROUP BY 子句合用。语法格式如下:

MIN(字段|表达式)

-- 说明:列的类型或表达式返回值的类型可以是任意类型

例如:

(1)查询所有学生的最小年龄

mysql> select min(year(now())-year(birth)) min_age from stu;
+---------+
| min_age |
+---------+
|      21 |
+---------+
1 row in set (0.00 sec)

(2)查询编号为【C01002】的课程的最低分

mysql> select min(score) min_score from xk where c_id='C01002';
+-----------+
| min_score |
+-----------+
|     68.00 |
+-----------+
1 row in set (0.00 sec)
6、连接数据值函数(GROUP_CONCAT)

使用 GROUP_CONCAT( ) 函数可以把某一列的数据值连接成一个字符串,数据值之间使用指定的分隔符分隔(默认为逗号)。语法格式如下:

GROUP_CONCAT([distinct] 列名 separator '分隔符')

-- 说明:列的类型或表达式返回值的类型可以是任意类型
-- 使用 separator 指定数据之间的分隔符,如果省略 separator,则默认的分隔符为逗号

例如:

(1)查询编号为【D01】的学院的学生名单

mysql> select group_concat(s_name) from stu where dept_id='D01';
+-----------------------------+
| group_concat(s_name)        |
+-----------------------------+
| 薛智玲,杨铭华,张从超,孙金航 |
+-----------------------------+
1 row in set (0.00 sec)

(2)查询编号为【D02】的学院的学生名单,学生之间用空格分隔

mysql> select group_concat(s_name separator '  ') from stu where dept_id='D01';
+-------------------------------------+
| group_concat(s_name separator '  ') |
+-------------------------------------+
| 薛智玲  杨铭华  张从超  孙金航      |
+-------------------------------------+
1 row in set (0.00 sec)

二、分组查询

使用 GROUP BY 关键字可以将查询结果按照一个或多个列或者表达式进行分组,分组的依据为 GROUP BY 后面的列名或表达式。GROUP BY 通常与聚合函数合用。

1、GROUP BY 的语法

GROUP BY 子句的语法格式如下:

GROUP BY <列名|表达式>[,...] [HAVING 条件表达式] [WITH ROLLUP]

--说明:1)使用分组查询时,select 后面的字段列表只能包含 GROUP BY 后面的列名或表达式以及聚合函数,不能包含其他的列或表达式,否则会报错。
(2)列名|表达式:分组依据,按列名或表达式进行分组。
(3HAVING 条件表达式:对分组进行选择,符合条件表达式的结果才会显示。
(4WITH ROLLUP:在所有记录的最后加上一条记录,该记录为对所有行的统计结果(求和)。
2、使用列名分组

例如:按照 s_id 分组,统计每个学生所学课程的平均分

mysql> select s_id, avg(score) avg_score from xk group by s_id;
+-------------+-----------+
| s_id        | avg_score |
+-------------+-----------+
| 20220124001 | 73.666667 |
| 20220124002 | 75.333333 |
| 20220124003 | 94.500000 |
| 20220124004 | 88.500000 |
| 20220214001 | 85.666667 |
| 20220214002 | 68.000000 |
| 20220214003 | 87.333333 |
| 20220325101 | 80.000000 |
| 20220325102 | 80.333333 |
| 20220325103 | 69.333333 |
| 20220410101 | 82.666667 |
| 20220410102 | 70.666667 |
| 20220410103 | 69.333333 |
| 20220410104 | 69.500000 |
+-------------+-----------+
14 rows in set (0.00 sec)
3、使用表达式分组

例如:按照学生的姓氏分组,查询每组对应的学生人数

mysql> select left(s_name, 2) surname, count(*) stu_cnt from stu group by surname;
+---------+---------+
| surname | stu_cnt |
+---------+---------+
||       1 |
||       1 |
||       1 |
||       1 |
||       1 |
||       2 |
||       2 |
||       1 |
||       1 |
||       1 |
||       1 |
||       1 |
+---------+---------+
12 rows in set (0.00 sec)
4、分组的同时使用 WHERE 子句

分组时如果使用了 WHERE 子句,则先使用 WHERE 对表中的数据进行筛选,然后进行分组和统计。

例如:利用 xk 表统计每门课程考试分数大于 80 分的学生人数

mysql> select c_id, count(*) stu_cnt from xk where score>80 group by c_id;
+--------+---------+
| c_id   | stu_cnt |
+--------+---------+
| C01001 |       3 |
| C01003 |       3 |
| C02102 |       1 |
| C02103 |       2 |
| C03201 |       2 |
| C03202 |       2 |
| C04112 |       2 |
| C04113 |       1 |
+--------+---------+
8 rows in set (0.00 sec)
5、使用 HAVING 对分组进行选择

使用 HAVING 子句可以对分组进行选择。当 HAVING 子句与 WHER 子句同时使用时,查询执行的顺序为:先使用 WHERE 对表中的记录进行筛选,然后对满足条件的记录分组与统计,再使用 HAVING 子句对分组进行选择。

例如:

(1)利用 xk 表查询每门课的选修人数,并且只显示选修人数大于 3 门的课程信息

mysql> select c_id, count(*) stu_cnt from xk group by c_id having stu_cnt>3;
+--------+---------+
| c_id   | stu_cnt |
+--------+---------+
| C01001 |       4 |
| C01003 |       4 |
| C04111 |       4 |
| C04112 |       4 |
+--------+---------+
4 rows in set (0.00 sec)

(2)利用 stu 表查询每个学院的男生人数,并且只显示男生人数大于 3 人的学院信息

mysql> select dept_id, count(*) stu_cnt from stu where gender='男' group by dept_id having stu_cnt>2;
+---------+---------+
| dept_id | stu_cnt |
+---------+---------+
| D03     |       3 |
+---------+---------+
1 row in set (0.00 sec)
6、WITH ROLLUP 参数

在所有记录的最后加上一条记录,该记录为对所有行的统计结果(求和)。

例如:

(1)利用 stu 表查询每个学院的学生人数以及总人数

-- 把 dept_id 为空的学生的 dept_id 修改为 D04
mysql> update stu set dept_id='D04' where dept_id is null;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

-- 分组查询
mysql> select dept_id, count(*) stu_cnt from stu group by dept_id with rollup;
+---------+---------+
| dept_id | stu_cnt |
+---------+---------+
| D01     |       4 |
| D02     |       3 |
| D03     |       3 |
| D04     |       4 |
| NULL    |      14 |
+---------+---------+
5 rows in set (0.00 sec)

(2)利用 stu 表查询每个学院的学生人数以及总人数,并把最后一行的 NULL 修改为 stu_total

mysql> select ifnull(dept_id, 'total') dept_id, count(*) stu_cnt from stu group by dept_id with rollup;
+---------+---------+
| dept_id | stu_cnt |
+---------+---------+
| D01     |       4 |
| D02     |       3 |
| D03     |       3 |
| D04     |       4 |
| total   |      14 |
+---------+---------+
5 rows in set, 1 warning (0.00 sec)

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

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

相关文章

【Canvas与标牌】盾形银底红带Best Quality Premium标牌

【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>BestQulityPremium金属牌重制版Draft2</title><style type&…

【YOLOv8实时产品缺陷检测】

YOLOv8应用于产品缺陷检测实例 项目概况项目实现YOLOv8安装及模型训练关键代码展示动态效果展示 项目概况 本项目是应用YOLOv8框架实现训练自定义模型实现单一零件的缺陷检测&#xff0c;软件界面由PyQt5实现。 功能已正式使用&#xff0c;识别效果达到预期。 项目实现 项目…

刷题 二分查找

二分查找 二分查找的本质就是 缩小有效范围 需要注意&#xff1a; int mid (left right) / 2; int mid left (right - left) / 2; 防止溢出 hot100 - 二分查找 ⭐️35. 搜索插入位置 找到第一个大于等于 target 的值 class Solution { public:// 目标: 找到第一个大于…

PD取电诱骗协议芯片支持PD3.1 支持大电流、大功率(28V5A 140W)快速充电。

PD取电快充协议芯片XSP16是受电端的一种PD取电快充协议芯片&#xff0c;它支持PD2.0/3.0&#xff0c;PD3.1、QC2.0/3.0、华为SCP/FCP、三星AFC等快充协议。支持UART串口发送电压/电流消息&#xff0c;供外部MCU读取&#xff0c;以便适应不同的负载。支持从充电器、车充、充电宝…

计算机基础知识:计算机中丢失 msvcr110.dll怎么修复?

1. msvcp110.dll 介绍 1.1 定义&#xff1a;Microsoft Visual C 2012的一部分 msvcp110.dll是Microsoft Visual C 2012 Redistributable Package的一部分&#xff0c;这是一个运行时库文件&#xff0c;包含了Microsoft Visual C 2012编译器所构建程序所需的函数和资源。 1.2…

使用Markdown Here插件生成邮件样式

使用Markdown Here插件生成邮件样式 通常大学生们都有给老师、助教使用邮箱发送作业的情景&#xff0c;怎样让自己发送的邮件美观呢&#xff0c;我们可以使用Markdown Here插件美化 以下为结果展示 Markdown Here 插件 官网地址 html代码 <font size"7", face…

大数据ETL数据提取转换和加载处理

什么是 ETL&#xff1f; 提取转换加载&#xff08;英语&#xff1a;Extract, transform, load&#xff0c;简称ETL&#xff09;&#xff0c;用来描述将资料从来源端经过抽取、转置、加载至目的端的过程。ETL一词较常用在数据仓库&#xff0c;但其对象并不限于数据仓库。 ETL&…

迎接国庆旅游热潮,火山引擎数据飞轮助力景区数智化升级

随着人们生活水平的提高和旅游消费观念的转变&#xff0c;国庆假期成为人们出行旅游的黄金时段。同程旅行发布的报告显示&#xff0c;北京、杭州、重庆、上海、南京、成都等城市仍是 “十一” 假期国内热门的目的地&#xff0c;而一些新兴的宝藏旅游目的地如新疆阿勒泰、云南迪…

《向量数据库指南》——Fivetran+Mlivus Cloud:打造AI搜索神器

哈哈,各位向量数据库和 AI 应用的同仁们,今天咱们来聊聊一个超级实用的话题——如何借助 Fivetran 和 Mlivus Cloud 构建 AI 驱动的搜索工具,从非结构化数据中挖掘出无尽的宝藏! 在这个信息爆炸的时代,非结构化数据已经成为了企业最重要的资产之一。它包含了大量的文本、…

进入猛增模式后,小米股价还剩下多少上涨空间?

猛兽财经核心观点&#xff1a; &#xff08;1&#xff09;小米集团的股价已经上涨到了2022年以来的最高点。 &#xff08;2&#xff09;股价从2023年的最低点上涨了185%以上。 &#xff08;3&#xff09;随着智能手机的需求反弹和电动汽车利润率的增长&#xff0c;猛兽财经认为…

YOLOv10改进策略【注意力机制篇】| NAM 即插即用模块,重新优化通道和空间注意力(含二次创新)

一、本文介绍 本文记录的是基于NAM模块的YOLOv10目标检测改进方法研究。 许多先前的研究专注于通过注意力操作捕获显著特征&#xff0c;但缺乏对权重贡献因素的考虑&#xff0c;而这些因素能够进一步抑制不重要的通道或像素。而本文利用NAM改进YOLOv10&#xff0c;通过权重的贡…

数字人直播违规被“封”,一文助你彻底解决!

随着数字人直播的日渐兴起&#xff0c;与之相关的各类消息逐渐进入到人们的视野之中&#xff0c;并开始成为众多企业、创业者以及技术爱好者所重点关注的对象。就目前的讨论情况来看&#xff0c;热度最高且讨论次数最多的便是数字人直播违规吗这一话题。 的确&#xff0c;从数字…

一个three三维 文字 粒子 着色器的作品用来感谢大家对github点星

一个three三维 文字 粒子 着色器的作品用来感谢大家对github点星 源链接&#xff1a;https://z2586300277.github.io/three-cesium-examples/#/codeMirror?navigationThreeJS&classifyshader&idtextStarShader 国内站点预览&#xff1a;http://threehub.cn github地…

CVE-2024-9014 pgAdmin4 OAuth2 client ID与secret敏感信息泄漏漏洞

文章目录 免责声明漏洞描述搜索语法漏洞复现nuclei修复建议 免责声明 本文章仅供学习与交流&#xff0c;请勿用于非法用途&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任 漏洞描述 pgAdmin4 是开源数据库 PostgreSQL 的图形管理工具攻击者可构造恶意…

向量数据库!AI 时代的变革者还是泡沫?

向量数据库&#xff01;AI 时代的变革者还是泡沫&#xff1f; 前言一、向量数据库的基本概念和原理二、向量数据库在AI中的应用场景三、向量数据库的优势和挑战四、向量数据库的发展现状和未来趋势五、向量数据库对AI发展的影响 前言 数据是 AI 的核心&#xff0c;而向量则是数…

一个设备不知道ip地址怎么办?应对策略来袭

在数字化时代&#xff0c;设备连接网络已成常态&#xff0c;IP地址作为设备的网络身份证&#xff0c;其重要性不言而喻。然而&#xff0c;面对设备IP地址遗失的困境&#xff0c;我们往往感到束手无策。 那么&#xff0c;一个设备不知道IP地址怎么办&#xff1f;本文将为你提供一…

中国通信技术革命史

文章目录 引言I 中国通信技术革命史电报中国卫星通信的历史固定电话寻呼机(BP机)大哥大(手机)制定自己的移动通信网络技术体系5G未来科技发展的总趋势:用更少的能量,传输、处理和存储更多的信息II 知识扩展通信史(单位能量的信息传输率越来越高,网络地不断融合。)超级智能…

秒杀系统的原则和注意项

做任何技术方案都需要结合当时的业务场景、资金情况、用户体量等维度综合考虑&#xff0c;没有最好的技术方案&#xff0c;只有最合适的技术方案。 做秒杀方案亦是如此&#xff0c;秒杀活动经常会引发高并发、系统宕机和库存超卖的棘手问题&#xff0c;作为开发者&#xff0c;我…

火情监测摄像机:守护生命与财产安全的“眼睛”

随着城市化进程的加快&#xff0c;火灾隐患日益增多。为了有效预防和及时应对火灾事故&#xff0c;火情监测摄像机应运而生&#xff0c;成为现代消防安全的重要组成部分。这种高科技设备不仅能够实时监控火灾发生&#xff0c;还能为救援提供宝贵的信息支持。火情监测摄像机主要…

vulnhub-THE PLANETS-EARTH靶机

下载并导入靶机至VMWare&#xff0c;设置网络模式为NAT&#xff0c;开机 开启攻击机&#xff08;kali&#xff09;&#xff0c;也设置为Nat模式&#xff0c;与靶机处于同一网段 扫描靶机ip Nmap 192.168.114.0/24 扫描网段内活跃的主机 可以推断靶机ip为192.168.114.129 扫描…