
今天学习汇总分析,一共六个知识点

一,汇总函数
函数就是一个功能,输入函数参数,它会向你返回值
- count函数 求某列的行数
例:查询教师表中教师姓名的行数
select count(教师姓名) from teacher;
注意,这里计算的是红色区域的

如果select的是*号,则会计算所有的行,计算结果会变成4
2. sum函数 对某列数据求和 (只对数值类型的列进行计算)
查询成绩表中的成绩总和
select sum(成绩) from score;
3. avg函数 求某列数据的平均值 (只对数值类型的列进行计算)
查询成绩表的学生平均成绩
select avg(成绩) from score;
4. max函数 求某列数据的最大值, min函数 求某列数据的最小值
查询成绩表的学生最大成绩以及最小成绩
select max(成绩),min(成绩) from score;
tips: 学生表中学生姓名有重复,想要查询有多少个学生 这个时候就要用到distinct
select count(distinct姓名) from student;
练习:
- 查询课程编号为‘0002’的总成绩
select sum(成绩) from score
where 课程号 = '0002';
2. 查询选了课程的学生人数
/*这里用count计算有多少个学生号即可,但是一个学生可能会选择多个课程,
就会出现重复的学生号,所以要用到distinct 去除重复 */
select count(distinct 学号) as 学生人数 from score;

二,分组
在sql中使用 group by对数据按某个条件进行分组,经常与上面的汇总 条件进行搭配使用
比如 查询男生就多少人,女生有多少人 就对男生女生进行分组
select 性别, count(*) as 学生人数 from student group by 性别;
运行顺序:

练习:
- 查询各科成绩最高分和最低分
select max(成绩) as 最高分, min(成绩) as 最低分 from score
group by 课程号;
-- 锁定成绩表之后,找到最高分最低分,再根据课程号分组
2. 查询每门课程被选修的学生数
select 课程号,count(学生号) as 学生人数from score
group by 课程号;
-- 锁定成绩表之后,找到学号,再根据课程号分组
3.查询男生女生人数
select 性别, count(*) as 学生人数 from student group by 性别;
三,对分组结果指定条件
用having指定分组以后的条件
例如,男生女生组中哪一个组是一个人以上
select 性别, count(*) as 学生人数 from student
group by 性别 having count(*) > 1;
面试题练习:
- 查询平均成绩大于60份学生的学号和平均成绩
select 学号,avg(成绩) as 平均成绩 from score
group by 学号
having avg(成绩) > 60;
-- 从成绩标准找到学号以及成绩,将其按学号分类号后,应用函数 抽取大于60分的学生 
2. 查询至少选修两门课程的学生学号
select 学号, count(课程号) as 选修课 from score
group by 学号
having count(课程号) >= 2;
-- 从成绩标准找到学号以及课程号,将其按学号分类号后,应用函数 抽取课程数量大于2的学生
3. 查询同名同姓学生名单并统计同名人数
select 姓名, count(*) as 人数 from student
group by 姓名
having count(*) >= 2;
/* 解题思路首先是 确定表student,然后根据题目所说的统计同名人数,那么就是按照姓名分组,
其次统计运用的就是count函数,同名的人数一定是两个及以上,
所以最后 用having提取计数两个以上的数据 */
四, 用SQL解决业务问题
要解决问题,先把要求翻译成大白话,再想解决问题的思路是什么,最后写sql语句
例如:如何计算各科平均成绩
先翻译成大白话,1. 各科成绩就是每门成绩,那么就是按照科目分组 group by 课程号
2. 平均成绩,就是需要函数avg
然后将查询语句的各个关键字写出来
select [查询结果] from [哪张表]
where [查询条件]
group by [分组]
having [对分组结果指定条件]
再与之对应
那么对应下来的结果就是:
表:score
查询条件:没有
分组 :课程号
对分组指定条件:没有
查询结果:课程号,avg(成绩)
select 课程,avg(成绩) from score
group by 课程号;练习题:计算每门课程的平均成绩并且平均成绩大于80分
解题思路:
表:score
查询条件:没有
分组 :课程号
对分组指定条件:平均成绩大于80分
查询结果:课程号,avg(成绩)
select 课程号,avg(成绩) from score
group by 课程号
having avg(成绩) >= 80;
五,对查询结果排序
order by是对查询结果排序
升序 ASC
降序 DESC
这个是放在最后的,所以在之前的公式后面再加一个order by 具体如下
select [查询结果]
from [哪张表]
where [查询条件]
group by [分组]
having [对分组结果指定条件]
order by[对查询结果进行排序]
练习题1:计算每门课程的平均成绩并且平均成绩大于80分 平均成绩相同时结果按降序排列
首先按照公式一步一步分析
表:score
查询条件:没有
分组 :课程号
对分组指定条件:平均成绩大于80分
结果排序 :降序 desc
select 课程号,avg(成绩) as 平均成绩 from score
group by 课程号
having avg(成绩) >= 80
order by 平均成绩 desc;;
运行顺序:

指定多个排序列名
例子2:要求升级升序,课程号降序
select * from score
order by 成绩 asc, 课程号 desc;
空值的排序 可用于查看空值
如查找教师表的空值
select * from teacher order by 教师姓名;如图所示,空值会在最前面显示

取出指定行 limit
去几行就写limit几
例如:查询成绩表中前两行的信息
select * from score
limit 2;
运行顺序:

练习题2:查询不及格的课程并按课程号从大到小排列
select 课程号 from score
where 成绩 < 60
order by 课程号 desc;
六,如何看懂报错信息
常见错误:在where中使用聚合函数
正确写法:
select 性别, count(*) as 学生人数 from student
group by 性别 having count(*) > 1;错误写法:
select 性别, count(*) as 学生人数
from student
where count(*) > 1
group by 性别 ;
如图所示,红色部分Err 表示报错,黄色部分显示的错误的信息,可根据英文知道发生了什么错误,加以改正
tips:数值类型与字符串类型的排序顺序以及算最大值时 是不一样的,所以一定要注意确认修改数据类型。

被折叠的 条评论
为什么被折叠?



