滚雪球学MySQL[3.2讲]:MySQL聚合函数与分组详解:COUNT、SUM、AVG、MAX、MIN及GROUP BY与HAVING

全文目录:

前言

在上一期的学习中,我们详细探讨了MySQL的多表查询(3.1),包括内连接(INNER JOIN)、外连接(LEFT JOIN、RIGHT JOIN)以及多表联合查询的技巧。通过这些知识,你已经能够在多个表之间进行数据关联和查询,为复杂的数据提取和分析打下了坚实的基础。

然而,随着数据量的增长,简单的查询往往无法满足我们的需求。在实际应用中,我们不仅需要从多个表中提取数据,还常常需要对这些数据进行统计分析。为了满足这些需求,MySQL提供了一系列强大的聚合函数 ,如COUNTSUMAVGMAXMIN等,用于对数据进行汇总、求和、取平均值和查找最大、最小值等操作。此外,结合GROUP BYHAVING语句,我们可以对数据进行分组,并对分组后的数据应用条件过滤。

本期内容将深入探讨MySQL中的聚合函数与分组操作(3.2),通过具体的示例帮助你全面掌握这些重要的SQL功能,提升你在数据统计和分析方面的技能。

在本期内容结束后,下一期我们将继续深入数据库的高级查询技巧,探讨如何进行复杂查询(3.3),进一步提升数据库的处理能力。

3.2 聚合函数与分组

1. COUNT、SUM、AVG、MAX、MIN等常用聚合函数

聚合函数是用于对一组值进行计算并返回单个值的函数,广泛用于数据分析中。MySQL支持多种聚合函数,下面我们将分别介绍最常用的五种。

1.1 COUNT函数

COUNT函数用于统计行数,通常用于计算满足特定条件的记录数。

基本语法
sql 复制代码
SELECT COUNT(列名) FROM 表名 WHERE 条件;
示例1:统计学生表中的总记录数

假设我们有一个名为students的表,包含学生的idnameage等信息。我们可以通过COUNT函数统计表中学生的总数:

sql 复制代码
SELECT COUNT(*) FROM students;

这将返回students表中的总记录数。

示例2:统计特定条件下的记录数

如果我们只想统计年龄大于20岁的学生数量,可以在WHERE条件中指定:

sql 复制代码
SELECT COUNT(*) FROM students WHERE age > 20;
1.2 SUM函数

SUM函数用于对一列数值进行求和操作,常用于计算总金额、总数等数据。

基本语法
sql 复制代码
SELECT SUM(列名) FROM 表名 WHERE 条件;
示例1:计算总成绩

假设我们有一个grades表,包含学生的成绩信息。我们可以通过SUM函数计算所有学生的总成绩:

sql 复制代码
SELECT SUM(score) FROM grades;
1.3 AVG函数

AVG函数用于计算某列数值的平均值,常用于统计平均成绩、平均工资等数据。

基本语法
sql 复制代码
SELECT AVG(列名) FROM 表名 WHERE 条件;
示例1:计算学生的平均成绩

我们可以使用AVG函数来计算所有学生的平均成绩:

sql 复制代码
SELECT AVG(score) FROM grades;
1.4 MAX函数

MAX函数用于查找某列的最大值,常用于获取最高分、最高工资等信息。

基本语法
sql 复制代码
SELECT MAX(列名) FROM 表名 WHERE 条件;
示例1:查询最高分

如果我们想查找最高的学生成绩,可以使用MAX函数:

sql 复制代码
SELECT MAX(score) FROM grades;
1.5 MIN函数

MIN函数用于查找某列的最小值,常用于获取最低分、最低工资等信息。

基本语法
sql 复制代码
SELECT MIN(列名) FROM 表名 WHERE 条件;
示例1:查询最低分

同样,我们可以使用MIN函数查找最低的学生成绩:

sql 复制代码
SELECT MIN(score) FROM grades;

2. GROUP BY 与 HAVING 分组与筛选

在实际工作中,除了对所有数据进行汇总分析外,我们经常需要对数据进行分组,然后对每个分组进行聚合计算。这时就需要用到GROUP BY语句。

2.1 GROUP BY 语句

GROUP BY用于将查询结果按照一个或多个列进行分组,并对每个分组进行聚合计算。它通常与聚合函数一起使用。

基本语法
sql 复制代码
SELECT 列1, 聚合函数(列2) FROM 表名 WHERE 条件 GROUP BY 列1;
示例1:按专业统计学生人数

假设我们有一个学生表,包含学生的专业信息。现在我们希望统计每个专业的学生人数:

sql 复制代码
SELECT major, COUNT(*) AS student_count 
FROM students 
GROUP BY major;

此查询将根据major列对学生进行分组,并统计每个专业的学生人数。

示例2:按专业计算平均成绩

假设我们有一个包含学生成绩的表,我们希望计算每个专业的平均成绩。可以使用以下查询:

sql 复制代码
SELECT major, AVG(score) AS average_score 
FROM students 
JOIN grades ON students.id = grades.student_id
GROUP BY major;

此查询会返回每个专业的平均成绩。

2.2 HAVING 语句

HAVING用于对分组后的数据进行过滤。与WHERE不同,HAVING是用于过滤聚合结果的。

基本语法
sql 复制代码
SELECT 列1, 聚合函数(列2) FROM 表名 WHERE 条件 GROUP BY 列1 HAVING 聚合函数(列2) 条件;
示例1:筛选出学生人数大于5的专业

假设我们希望只显示学生人数超过5人的专业:

sql 复制代码
SELECT major, COUNT(*) AS student_count 
FROM students 
GROUP BY major 
HAVING COUNT(*) > 5;

此查询会筛选出学生人数大于5的专业。

示例2:筛选出平均成绩高于80的专业

如果我们想要筛选出平均成绩大于80分的专业,可以使用HAVING语句:

sql 复制代码
SELECT major, AVG(score) AS average_score 
FROM students 
JOIN grades ON students.id = grades.student_id
GROUP BY major 
HAVING AVG(score) > 80;

3. 聚合函数与分组的高级应用

聚合函数和分组操作是数据库分析的核心功能,特别是在大数据分析中,常常用于生成报表和分析数据趋势。以下是几个常见的高级应用场景。

3.1 多字段分组

除了按单个字段分组外,我们还可以按多个字段分组。例如,统计每个年级中不同专业的学生人数:

sql 复制代码
SELECT grade, major, COUNT(*) AS student_count 
FROM students 
GROUP BY grade, major;
3.2 使用CASE与聚合函数

我们可以结合CASE语句与聚合函数进行条件汇总。例如,统计男生和女生的人数:

sql 复制代码
SELECT 
  SUM(CASE WHEN gender = 'Male' THEN 1 ELSE 0 END) AS male_count,
  SUM(CASE WHEN gender = 'Female' THEN 1 ELSE 0 END) AS female_count
FROM students;

这种技术在需要根据特定条件进行分类统计时非常有用。

结语与下期预告

通过本期的学习,你已经掌握了MySQL中的聚合函数与分组操作 ,并了解了如何使用COUNTSUMAVGMAXMIN等函数进行数据汇总分析,以及如何结合GROUP BYHAVING语句对数据进行分组与筛选。这些知识是数据库分析的核心技能,尤其适用于统计、数据挖掘等场景。

在下期内容中,我们将进一步探讨复杂查询(3.3),包括子查询、联合查询和嵌套查询等技术,帮助你在更复杂的场景中处理数据。敬请期待!

相关推荐
师太,答应老衲吧32 分钟前
SQL实战训练之,力扣:2020. 无流量的帐户数(递归)
数据库·sql·leetcode
Yaml41 小时前
Spring Boot 与 Vue 共筑二手书籍交易卓越平台
java·spring boot·后端·mysql·spring·vue·二手书籍
Channing Lewis2 小时前
salesforce case可以新建一个roll up 字段,统计出这个case下的email数量吗
数据库·salesforce
追风林2 小时前
mac 本地docker-mysql主从复制部署
mysql·macos·docker
毕业设计制作和分享3 小时前
ssm《数据库系统原理》课程平台的设计与实现+vue
前端·数据库·vue.js·oracle·mybatis
ketil273 小时前
Redis - String 字符串
数据库·redis·缓存
Hsu_kk4 小时前
MySQL 批量删除海量数据的几种方法
数据库·mysql
编程学无止境4 小时前
第02章 MySQL环境搭建
数据库·mysql
knight-n4 小时前
MYSQL库的操作
数据库·mysql
包饭厅咸鱼5 小时前
QML----复制指定下标的ListModel数据
开发语言·数据库