数据库上机练习
问题描述:
本题目要求编写UPDATE语句, 计算每位学生已获得的总学分并填写在stu表中的totalcredit字段。
其中,总学分为每个学生通过的选修课程的学分数总和,注意:只有在60分以上的选课成绩才能获得该门课程的学分数,每门课程的学分数在cou表中credit字段。
表结构:
请在这里写定义表结构的SQL语句。例如:
CREATE TABLE `stu` (
`sno` char(4) NOT NULL,
`sname` char(8) NOT NULL,
`sex` tinyint(1) DEFAULT NULL,
`mno` char(2) DEFAULT NULL,
`birdate` datetime DEFAULT NULL,
`memo` text,
`totalcredit` smallint(6) DEFAULT NULL,
PRIMARY KEY (`sno`)
);
CREATE TABLE `cou` (
`cno` char(4) NOT NULL,
`cname` varchar(30) NOT NULL,
`credit` smallint(6) DEFAULT NULL,
`ptime` char(5) DEFAULT NULL,
`teacher` char(10) DEFAULT NULL,
PRIMARY KEY (`cno`)
);
CREATE TABLE `sc` (
`sno` char(4) NOT NULL,
`cno` char(4) NOT NULL,
`grade` decimal(6,1) DEFAULT NULL,
`rank` char(255) DEFAULT NULL,
PRIMARY KEY (`sno`,`cno`),
CONSTRAINT `fk_sc_cno` FOREIGN KEY (`cno`) REFERENCES `cou` (`cno`),
CONSTRAINT `fk_sc_sno` FOREIGN KEY (`sno`) REFERENCES `stu` (`sno`)
);
表样例
请在这里给出上述表结构对应的表样例。例如
cou表:
sc表:
原因分析:
这个问题解决的关键在于怎么按码,改变相应元组的其他属性,正确的方法是用两张表
update A,B
set A.x=B.x
where A.主码=B.主码
那么现在的问题是如何建立一个含有sum(credit)和sno的新表
代码如下
select sno,sum(credit)
from(
select stu.sno sno,case when sc.grade>=60 then credit else NULL end credit
from stu left outer join sc on stu.sno=sc.sno left outer join cou on sc.cno=cou.cno
group by stu.sno,credit,grade) a
group by sno
接下来的操作就是两张表的结合了,即可得到正确答案:
正确解答
UPDATE stu,(select sno,sum(credit) SUM
from(
select stu.sno sno,case when sc.grade>=60 then credit else NULL end credit
from stu left outer join sc on stu.sno=sc.sno left outer join cou on sc.cno=cou.cno
group by stu.sno,credit,grade) a
group by sno) B
SET stu.totalcredit = B.SUM
where stu.sno = B.sno
点个关注吧,求求了,我会努力更新的。(上次的数理统计复习我会陆续上传的)