练习SQL经典50题(二)

今天更新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); 

  1. 检索" 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这样的列名是不合法的,不能用数字开头;二是左连接时必

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值