【SQL练习】 计算并填写学生获得的总学分 本题目要求编写UPDATE语句, 计算每位学生已获得的总学分并填写在stu表中的totalcredit字段。

此文转载自:https://blog.csdn.net/qq_45552117/article/details/110086939

数据库上机练习

问题描述:

本题目要求编写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

点个关注吧,求求了,我会努力更新的。(上次的数理统计复习我会陆续上传的)

原文地址:https://www.cnblogs.com/phyger/p/14035019.html