/*
翻译成大白话:
第1步,需要先计算出每个学生选修的课程数据,需要按学号分组
第2步,至少选修两门课程:也就是每个学生选修课程数目>=2,对分组结果指定条件
分析思路
select 查询结果 [学号,每个学生选修课程数目:汇总函数count]
from 从哪张表中查找数据 [课程的学生学号:课程表score]
where 查询条件 [至少选修两门课程:需要先计算出每个学生选修了多少门课,需要用分组,所以这里没有where子句]
group by 分组 [每个学生选修课程数目:按课程号分组,然后用汇总函数count计算出选修了多少门课]
having 对分组结果指定条件 [至少选修两门课程:每个学生选修课程数目>=2]
*/select 学号,count(课程号)as 选修课程数目
from score
groupby 学号
havingcount(课程号)>=2;
4.查询每门课程的平均成绩,结果按平均成绩升序排序,平均成绩相同时,按课程号降序排列
/*
分析思路
select 查询结果 [课程号,平均成绩:汇总函数avg(成绩)]
from 从哪张表中查找数据 [成绩表score]
where 查询条件 [没有]
group by 分组 [每门课程:按课程号分组]
having 对分组结果指定条件 [没有]
order by 对查询结果排序[按平均成绩升序排序:asc,平均成绩相同时,按课程号降序排列:desc];
*/select 课程号,avg(成绩)as 平均成绩
from score
groupby 课程号
orderby 平均成绩 asc,课程号 desc;
5.查询两门以上不及格课程的同学的学号及其平均成绩
/*
分析思路
先分解题目:
1)[两门以上][不及格课程]限制条件
2)[同学的学号及其平均成绩],也就是每个学生的平均成绩,显示学号,平均成绩
分析过程:
第1步:得到每个学生的平均成绩,显示学号,平均成绩
第2步:再加上限制条件:
1)不及格课程
2)两门以上[不及格课程]:课程数目>2
/*
第1步:得到每个学生的平均成绩,显示学号,平均成绩
select 查询结果 [学号,平均成绩:汇总函数avg(成绩)]
from 从哪张表中查找数据 [涉及到成绩:成绩表score]
where 查询条件 [没有]
group by 分组 [每个学生的平均:按学号分组]
having 对分组结果指定条件 [没有]
order by 对查询结果排序[没有];
*/select 学号,avg(成绩)as 平均成绩
from score
groupby 学号;/*
第2步:再加上限制条件:
1)不及格课程
2)两门以上[不及格课程]
select 查询结果 [学号,平均成绩:汇总函数avg(成绩)]
from 从哪张表中查找数据 [涉及到成绩:成绩表score]
where 查询条件 [限制条件:不及格课程,平均成绩<60]
group by 分组 [每个学生的平均:按学号分组]
having 对分组结果指定条件 [限制条件:课程数目>2,汇总函数count(课程号)>2]
order by 对查询结果排序[没有];
*/select 学号,avg(成绩)as 平均成绩
from score
where 成绩 <60groupby 学号
havingcount(课程号)>2;
四、复杂查询
1.查询所有课程成绩小于60分学生的学号、姓名
【知识点】子查询
1.翻译成大白话
1)查询结果:学生学号,姓名
2)查询条件:所有课程成绩 <60 的学生,需要从成绩表里查找,用到子查询
第1步,写子查询(所有课程成绩 <60 的学生)
select 查询结果[学号]from 从哪张表中查找数据[成绩表:score]where 查询条件[成绩 <60]groupby 分组[没有]having 对分组结果指定条件[没有]orderby 对查询结果排序[没有]limit 从查询结果中取出指定行[没有];select 学号
from student
where 成绩 <60;
第2步,查询结果:学生学号,姓名,条件是前面1步查到的学号
select 查询结果[学号,姓名]from 从哪张表中查找数据[学生表:student]where 查询条件[用到运算符in]groupby 分组[没有]having 对分组结果指定条件[没有]orderby 对查询结果排序[没有]limit 从查询结果中取出指定行[没有];*/select 学号,姓名
from student
where 学号 in(select 学号
from student
where 成绩 <60);
五、多表查询
1.查询平均成绩大于85的所有学生的学号、姓名和平均成绩
select a.学号,a.姓名,avg(b.成绩)as 平均成绩
from student as a leftjoin score as b
on a.学号 = b.学号
groupby a.学号
havingavg(b.成绩)>85;
select a.学号,a.姓名
from student as a innerjoin score as b on a.学号=b.学号
where b.课程号='0003'and b.成绩>80;
4.查询不同老师所教不同课程平均分从高到低显示
select a.教师号,a.教师姓名,avg(c.成绩)from teacher as a
innerjoin course as b
on a.教师号= b.教师号
innerjoin score c on b.课程号= c.课程号
groupby a.教师姓名
orderbyavg(c.成绩)desc;
5.查询课程编号为“0001”的课程比“0002”的课程成绩高的所有学生的学号
select a.学号
from(select 学号 ,成绩 from score where 课程号=01)as a
innerjoin(select 学号 ,成绩 from score where 课程号=02)as b
on a.学号 =b.学号
innerjoin student c on c.学号 =a.学号
where a.成绩 >b.成绩 ;
6.查询学过“孟扎扎”老师所教的所有课的同学的学号、姓名
select s.学号 ,s.姓名,a.学号 ,b.课程号,c.教师号 ,c.教师姓名
from student as s
innerjoin score as a
on s.学号 =a.学号
innerjoin course b on a.课程号 =b.课程号
innerjoin teacher c on b.教师号 = c.教师号
where c.教师姓名 ='孟扎扎';
select 姓名 ,学号
from student
where 学号 notin(select a.学号
from student as a
innerjoin score as b
on a.学号 =b.学号
innerjoin course as c on b.课程号 =c.课程号
innerjoin teacher as d on c.教师号 =d.教师号
where d.教师姓名 ='孟扎扎');
8.查询选修“孟扎扎”老师所授课程的学生中成绩最高的学生姓名及其成绩
select a.姓名,b.成绩
from student as a
innerjoin score as b on a.学号=b.学号
innerjoin course as c on b.课程号 =c.课程号
innerjoin teacher as d on c.教师号 = d.教师号
where d.教师姓名 ='孟扎扎'orderby b.成绩 desclimit1;
9.按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩
select a.学号,avg(a.成绩 ),max(casewhen b.课程名称 ='数学'then a.成绩 elsenullend)as'数学',max(casewhen b.课程名称 ='语文'then a.成绩 elsenullend)as'语文',max(casewhen b.课程名称 ='英语'then a.成绩 elsenullend)as'英语'from score as a
innerjoin course as b
on a.课程号 =b.课程号
groupby a.学号 ;