设教学数据库中有三个基本表:
学生表 S(SNO,SNAME,AGE,SEX),其属性表示学生的学号、姓名、年龄和性别;选课表 SC(SNO,CNO,GRADE),其属性表示学生的学号、所学课程的课程号和成绩;课程表 C(CNO,CNAME,TEACHER),其属性表示课程号、课程名称和任课教师姓名。 下面的题目都是针对上述三个基本表操作的(原题S#、C#这样子写法在查询的时候会报错,这里就用SNO、CNO代替吧,在naticat里面“#”这个是注释。。。)
其实这道题网上也有,但是我自己试了很多答案是错的,服了。我自己做一遍吧。。。
分析:建表,选课表SNO、CNO是外键
设计表就自己建,下面给出表数据:
学生表 S(SNO,SNAME,AGE,SEX)
选课表 SC(SNO,CNO,GRADE)
课程表 C(CNO,CNAME,TEACHER)
第(2)题用的表 SC_C(C#,CNAME, AVG_GRADE)
(1)写出检索 全是 女同学 选修的课程的课程号的SQL语句。
网上的答案:
SELECT cno FROM sc where cno not in (SELECT cno from s,sc WHERE s.sno=sc.sno and sex = '女');
我查出来的是空的(查出来应该是男同学单独选的,这里没有所以为空)
错的。我觉得应该把SQL语句里面的条件“女”改为“男”。
SELECT cno FROM sc where cno not in (SELECT cno from s,sc WHERE s.sno=sc.sno and sex = '男');
看看结果
查出来了。
我自己的分析:选课表里面,肯定是 不是男的同学 就是女的同学(应该没有鬼。。。)选出全部的课程号,除去男同学选的(包括有男有女选的课程号)剩下的就是全是女同学选的,换句话讲,就是只有女同学选这个课程号。
这里不知道理解有没有错,欢迎各位看官评论区讨论交流。。。
(2)写出下列插入操作的SQL语句:把SC表中每门课程的平均成绩插入到另一个已存在的表SC_C(C#,CNAME, AVG_GRADE)中,其中 AVG_GRADE 为每门课程的平均成绩。
insert into SC_C(cno,cname,AVG_GRADE)
select c.cno,c.cname,avg(GRADE) from sc,c
where sc.cno=c.cno group by c.cno,cname;
查询结果
后面2题暂时先把网上答案贴上(也是错的。。。仅供参考)
(3)试写出下列删除操作的SQL语句:从SC表中把WU老师的女学生选课元组删去。
delete from sc where
sno in (select sno from s where sex = '女')
and cno in (SELECT cno from c where teacher = 'WU');
(4)写出检索每门课程前五名的学生姓名。
SELECT SNAME
FROM S,SC
WHERE S.SNO=SC.SNO
AND SC.GRADE IN
(SELECT TOP 5 GRADE FROM SC GROUP BY CNO ORDER BY GRADE DESC)