笔试常考的学生表查询SQL(亲测,绝对正确)

问题:
已知关系模式:

  • s (sno,sname) 学生关系表 ---------- sno为学号,sname为姓名
  • c (cno,cname,cteacher) 课程关系-- cno为课程号,cname为课程名,cteacher为任课教师
  • sc(sno,cno,scgrade) 选课关系表— sno关联s,cno关联c,scgrade为成绩

根据此关系式我自己建立了几个表:

1.s表
在这里插入图片描述
2.c表
在这里插入图片描述
3.sc表
在这里插入图片描述

建表的过程就不详细说了,下面看问题:

问题1:找出没有选修过“马云”老师的课的所有学生姓名
select S.sno,S.sname from S where S.sno not in (
select S.sno from SC,C,S where SC.cno = C.cno and SC.sno=S.sno and C.cteacher='马云'
);

思路:
1.根据表的关联字段将表先连接起来
2.找出S表中存在的关于任课老师是马云的字段
3.利用not in 字段筛选出认可老师不是马云的sno,得到学生的姓名和编号

问题2:列出有两门以上(含两门)不及格课程的学生姓名及其平均成绩
select S.sno,S.sname,avg(SC.scgrade) avg_SCgrade from S,SC,(
select sno from SC where scgrade<60 group by sno having count(distinct cno)>=2)A
where S.sno=A.sno and SC.sno=A.sno group by S.sno,S.sname;

思路:
1.找出SC表中按sno分组且包含两门和两门以上成绩不及格的学生的sno,设别名为A;
2.找出S,SC中包含上述sno的学生的平均成绩;

问题3:列出即学过课程名为"C语言开发"的课程,又学过"数据库基础"的学生姓名
select S.sno,S.sname from S,(
select SC.sno from SC,C where SC.cno =C.cno and C.cname in ('C语言开发','数据库基础') 
group by sno having count(distinct C.cno)=2)A 
where S.sno =A.sno;

思路:
1.找出SC表中所有的选过课程“C语言开发”和“数据库基础”的学生,再利用having 函数对结果进行过滤
2.找出于上述查找时sno相等的学生的sno和name

问题4:列数"C语言开发"课程成绩比"数据库基础"高的所有学生的学号及其"C语言开发"和"数据库基础"这两门课的成绩
select SC.sno ,SC.scgrade '1号成绩' ,b.scgrade '2号成绩' from SC join SC as b
where sc.sno=b.sno and sc.cno=1 and b.cno=2 and SC.scgrade>b.scgrade;

思路:
1.设置两张相同的SC表,一张起别名为b
2.利用连接查询找出符合条件的记录

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值