今天更新SQL经典50题的第11小问到第20小问。
11. 查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩;
思路是将分数小于60的行与学生表联结起来,再根据sid分组,找出满足条件的列,产生的一个现象是:虽然求的是avg(sc1.score),但是在数据库执行的时候,找出的平均值是包含大于60分的行的,也就是说其实求得是sc表的平均分。
select s.sid, s.sname, avg(sc1.score) as avg_score
from (select * from SC where score<60) sc1, Student s
where sc1.sid=s.sid
group by s.sid,s.sname
having count(sc1.cid)>1;
另一种思路做法:先联结SC/Student两表,使sid满足两门及以上不及格这个子查询。
select s.sid,s.sname,avg(score) as avg_score
from SC inner join student s
on SC.sid=s.sid
group by s.sid,s.sname
having s.sid in (select sid
from SC
where score<60
group by sid
having count(cid)>=2);
- 检索" 01 "课程分数小于 60,按分数降序排列的学生信息;
联结SC和STUDENT,用where筛选出01课程分数小于60的行,再用order by按照分数降序。
select s.*
from SC inner join Student s
on SC.sid=s.sid
where cid='01' and score<60
order by score desc;
13. 按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩;
我的思路是用学生表左联结各科成绩以及平均成绩表,有两个要注意的点:一是01_score这样的列名是不合法的,不能用数字开头;二是左连接时必