目录
一,聚合函数
1,常用聚合函数
2,具体使用
二,GROP BY子句分组
1,基础语法
2,具体使用
3,加上HAVING对组进行筛选
4,使WHERE记录查询条件
汇总查询:在对数据库进行查询时,经常需要查询汇总信息,例如统计某门课不及格人数,得到不及格率,或者是统计课程的平均分等。
在SQL中,有5个聚合函数用于汇总等查询:Sum,Avg,Min,Max,Count。
一,聚合函数
1,常用聚合函数
常用的聚合函数有:Sum(),Avg(),Min(),Max(),Count()。
函数 | 功能 |
Sum(expression) | 对数字表达式中的所有列求和,仅能再数值型列中使用 |
Avg(expression) | 对数字表达式中的所有列求平均值,仅能在数值型列中使用 |
Min(expression) | 求表达式中的最小值,不可以在bit数据类型中使用 |
Max(expression) | 求表达式中的最大值,不可以在bit数据类型中使用 |
Count(*) | 计算所选定行的行数,即共有多少表中的记录参与了计算。一般用来统计个数。 如下,统计班级编号为1(1班)的学生人数👇 |
Count(expression) | 计算表达式中值的个数 |
2,具体使用
它们的用法类似,都是将需要进行统计的列作为参数传入函数中(即小括号内)。
在之前创建的成绩表score中,得分get列是tinyint数据类型(数值型数据),可以对get列进行求和,平均,取最大,最小等操作。表结构如下👇
由于之前向成绩表中填充的成绩只有课程编号为1的课程成绩,接下来需要再填充课程编号2和3的学生成绩(成绩表是学生表和课程表的从表,需要先确保课程表中有相应的课程,学生表中有相应的学生),因此先填充课程表,之后再填充成绩表:
-- 插入课程表courses中的数据(这里可以多填点记录)
INSERT INTO courses(cno,cne,cpd,cct)
VALUES
('1','SQLserver DataBase Application principle','96','6'), --SQL server 数据库应用原理
('2','C Language','86','3'), -- C语言
('3','Introduction to Computer Science','86','3'), --计算机科学导论
('4','Principle of Computer Organization ','80','3'), --计算机组成原理
('5','Computer Network','90','5') --计算机网络
-- 插入成绩表score中的数据
INSERT INTO courses(cno,cne,cpd,cct)
VALUES
('1','2','90'),
('2','2','50'),
('3','2','77'),
('4','2','90'),
('5','2','66'),
('1','3','88'),
('2','3','78'),
('3','3','68'),
('4','3','58'),
('5','3','86')
小任务:统计学号为2,名字叫 lisi (李四)的同学所上课程的总成绩,平均值,最高分,最低分,如下👇
二,GROP BY子句分组
1,基础语法
需要使用到之前的查询语法:
SELECT 列名或表达式
--INTO 新表名 --创建新表并将结果集插入新表中
FROM 表名 --指定查询语句中所使用的表或视图
WHERE 查询条件 --设定检索条件。定义了源表中的行要满足SELECT语句的要求所必须达到的条件。只有符合条件的行才向结果集提供数据。即,不采用不符合条件的行数据。
GROUP BY 分组表达式 --分组子句
HAVING 分组条件 --和GROUP BY 一起使用,表示过滤组。
--ORDER BY 列名或表达式 ASC升序/DESC降序 --为查询结果排序。
其中:
- GROUP BY 子句将查询结果按分组表达式进行分组,值相等的的记录为一组。
- 结果集中给每组(至多)产生一一行记录。
- 查询列表中的项只能来自GROUP BY 中的分组字段或聚合函数。
- HAVING 为结果集中的组设置条件,只有满足条件的组才能输出。
如果需要每个班的学生人数,每门课的平均分等这样的统计数据,就需要对记录进行分组。同一组记录进行汇总统计。
2,具体使用
例如,统计每门功课的平均分:按照课程号分组。
SELECT cno AS 课程号,Avg(get) AS 课程平均分 FROM score GROUP BY cno
3,加上HAVING对组进行筛选
如果还想要对分组后的结果进一步,如只查看课程平均分大于等于75分的课程,就需要在GROUP BY 语句的后面加上HAVING 用于筛选组。如下👇
SELECT cno AS 课程号,Avg(get) AS 课程平均分 FROM score
GROUP BY cno HAVING Avg(get)>=75
4,使WHERE记录查询条件
有时在分组之前就需要对查询的结果集进行判断,因此需要加上之前所学的WHERE子句,记录结果集的查询条件。
例如,查询至少有一门课程成绩不及格的学生学号。如下👇
SELECT sno AS 学号,Count(*) AS 不及格门数
FROM score WHERE get<60
GROUP BY sno
HAVING Count(*)>=1
需要注意的是,WHERE子句中不能有聚合函数,主要是因为,在 SQL 中,WHERE 子句用于过滤结果集中的行,而聚合函数是用于对一组行进行计算的函数。聚合函数的计算通常是在数据分组之后进行。
有问题请在评论区留言或者是私信我,回复时间不超过一天。