问题:
已知关系模式:
- 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.利用连接查询找出符合条件的记录