求助,这些查询看简单,可我一个也没做出来,特别想知道..
这是一个公司的面试题,因第一个没做出来..后面的就都没做出来了..
题目如下:
学生表 S (SNO, SNAME) SNO为学生号,SNAME为学生名
课程表 C (CNO,CNAME,CTEACHER) CNO为课程号,CNAME为课程名,CTEACHER课程老师
()
学生课程关系表 SC (SNO ,CNO,SCERAPER) SCERAPER为学生成绩..
1.查询出没有选修李明老师课的学生名字.
2.二科课程以上(包括两科)不及格学生姓名及平均成绩.
3.即学过课程A又学过课程B的学生名.
4.课程A成绩比课程B好的学生名
5.课程A成绩比课程B好的学生名,及这些学生课程A的成绩,及课程B的成绩
我基本都没操作出来,感觉简单,但select后就发现需要合并表..但是我当时都做错了..哎..惭愧呀..求解..
------解决方案--------------------1.select SNAME from s where SNO in(select SNO from sc ,c where sc.CNO = d.CNO and c.CTEACHER = '李明 ')
------解决方案--------------------1.查询出没有选修李明老师课的学生名字.
select s.sname from s left join (
select sc.sno from c inner join sc on c.cno=sc.cno where c.CTEACHER= '李明 ') as t
on s.snp=t.sno
where t.sno is null
or:
select s.sname from s
where not exists (
select 1 from c,sc where c.CTEACHER= '李明 ' and c.cno=sc.cno
and sc.sno=s.sno
)
2.二科课程以上(包括两科)不及格学生姓名及平均成绩.
select s.sname,avg(sc.SCERAPER) as AVGSCERAPER
from s,sc,(
select SNO
from sc
where SCERAPER <60
group by SNO
having count(*)> =0
) as t
where s.sno=sc.sno
and s.sno=t.sno
group by s.sname
3.即学过课程A又学过课程B的学生名.
select s.sname
from s,sc a,sc b,c ac,c bc
where s.sno=a.sno
and s.sno=b.sno
and a.cno=ac.cno
and b.cno=bc.cno
and ac.cname= 'A '
and bc.cname= 'b '
4.课程A成绩比课程B好的学生名
select s.sname
from s,sc a,sc b,c ac,c bc
where s.sno=a.sno
and s.sno=b.sno
and a.cno=ac.cno
and b.cno=bc.cno
and ac.cname= 'A '
and bc.cname= 'b '
and a.SCERAPER> b.SCERAPER
5.课程A成绩比课程B好的学生名,及这些学生课程A的成绩,及课程B的成绩
select s.sname,a.SCERAPER as ASCERAPER,b.SCERAPER as BSCERAPER
from s,sc a,sc b,c ac,c bc
where s.sno=a.sno
and s.sno=b.sno
and a.cno=ac.cno
and b.cno=bc.cno
and ac.cname= 'A '
and bc.cname= 'b '
and a.SCERAPER> b.SCERAPER