数据库题:学生表,选课表,课程表写SQL(多表)

设教学数据库中有三个基本表:

学生表 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)

 

 

 

 

 

 

  • 4
    点赞
  • 32
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:技术黑板 设计师:CSDN官方博客 返回首页
评论

打赏作者

软件测试李同学

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值