数据库,急求答案,完整 120
③学生选课关系:SC(Sno,Cno,Grade),属性Sno,Cno,Grade分别表示学号、课程号和成绩,主码为属性组(Sno,Cno)。
(1)用SQL语言实现下列查询
①检索年龄在18到20之间(包括18和20)的女生的学号、姓名和年龄;
②检索每个学生的学号、姓名、选修的课程及成绩;
③检索英语课的最高成绩和最低成绩;
④查询至少选修了学号为2000014的学生所选修的全部课程的学生姓名及所在系。
(2)用关系代数实现下列查询
①查询选修课程名为管理学的学生的学号和姓名
②查询至少选修课程号为1024和1136的学生的学号
③查询没有学课程号为1156课程的学生姓名和所在系
④查询所学课程包含学生王林所学课程的学生的姓名
SQL 展开
本来想给977657205一个赞的,但是发现里面有的语句有错误,所以这里更正一下(977657205同学也很不容易的)。后面的要求关系代数
1.1没什么问题,下面是另一种实现方式,作为试题可能是考察的这个
select Sno,Sname,Sage from Student where Sage between 18 and 20;
1.2 977657205是一种比较严谨的答案,另一种简单的就是三个表简单连接,但没有考虑有没选过课的学生问题,977657205的答案想考虑这类问题,但写的不对,应该和SC连接的时候就用left outer join
select s.Sno,s.Sname,c.Cname,SC.Grade
from Student s , SC , Cource c
where SC.Sno=s.Sno and SC.Cno=c.Cno;
1.3 一个简单的写法如下
select max(Grade),min(Grade) from SC, Cource C where SC.Cno=C.Cno and Cname='英语'
1.4 这个是导致我回这个问题的主要原因,很多人都是错在这个问题上了。对于全称量词,sql没有语句实现,因此要转为双重否定,这样的语义就是:找出没有哪门课学号为2000014的学生学修了,而该生没有选修的学生,因此语句要有not exists,不是not in
select Sname,Sdept
from Student S
where not exists (select * from SC T1
where T1.Sno='2000014' and not exists (select * from SC T2 where T2.Cno=T1.Cno and T2.Sno=S.Sno))
2 基本上都不对,我用word写完截图传上来吧
1.1 select Sno,Sname,Sage from Student where Sage >= 18 and Sage <= 20;
1.2 select s.Sno,s.Sname,c.Cname,sac.Grade from Student s full join SC sac on sac.Sno=s.Sno left join Cource c on c.Cno=sac.Cno;
1.3 select max(Grade),min(Grade) from SC where Cno=(select Cno from Cource where Cname='英语') group by Cno;
1.4 select Sname,Sdept from Student where sno in (select Sno from SC where Cno in (select Cno from SC where Sno='2000014') group by Sno having count(Sno)>=(select count(*) from SC where Sno='2000014'))
2.1 select s.Sno,s.Sname from Student s left join SC sac on sac.Sno=s.Sno left join Cource c on c.Cno=sac.Cno where c.Cname='管理学'
2.2 select s,Sno,s.Sname from (select Sno sn from SC where Cno in ('1024','1136') group by Sno having count(Sno)>=2) tmp left join Student s on tmp.Sno=s.Sno
2.3 select s.Sname,s.Sdept from Student s left join (select Sno from SC where Cno='1156') tmp on tmp.Sno=s.Sno where s.Sno not in (tmp.Sno)
2.4 select s.Sname from (select Sno from SC where Cno in (select Cno from SC where Sno='2000014') group by Sno having count(Sno)>=(select count(*) from SC where Sno=(select Sno from Student where Sname='王林'))) tmp left join Student s on s.Sno=tmp.Sno