题目是从学校MOOC平台粘过来的!
3.8 对于教学数据库的三个基本表:
S(学号,姓名 ,年龄,性别)
SC(学号 ,课程号,成绩)
C(课程号 ,课程名,任课教师姓名)
试用SQL语句表达下列查询:
⑴ 查询姓刘的老师所授课程的课程号和课程名。
⑵ 查询年龄大于23岁的男同学的学号和姓名。
⑶ 查询学号为S3的学生所学课程的课程号、课程名和任课教师姓名。
⑷ 查询“张小飞”没有选修的课程号和课程名。
⑸ 查询至少选修了3门课程的学生的学号和姓名。
⑹ 查询全部学生都选修了的课程编号和课程名称。
⑺ 在SC中删除尚无成绩的选课元组。
⑻ 把“高等数学”课的所有不及格成绩都改为60。
⑼ 把低于总评均成绩的女同学的成绩提高5%。
⑽ 向C中插入元组(‘C8’,‘VC++’,‘王昆’)
无法把要更新的表放在from语句下:
You can’t specify target table for upedate in from column
解决方案
需要把(逻辑上)需要放在from之后的表(也就是那些满足筛选条件的与元组集合)伪装成一个新的表,再从中取出作为限制条件。
我觉得有些吃力的是(8)、(9):
#(8)
update sc as a,(select 学号,课程号 from sc where 课程号=(select 课程号 from c where 课程名='高等数学')) as b
set 成绩=60
where a.学号=b.学号
and a.课程号=b.课程号
and a.成绩<60
;
#(9) 这种方法有缺陷---只通过将修改元组的学号来选择记录
update sc
set 成绩=(1+0.05)*成绩
where 学号 in (
select a.学号 from
(select DISTINCT s.学号
from s join sc on s.学号=sc.学号
where sc.成绩<(select avg(成绩) from sc)
and s.性别='女') as a
);
修整一下:
#题目:把高等数学不及格的成绩都修改成60
#首先选出高等数学不及格的学号和课程号
SELECT 学号,课程号 FROM SC WHERE 成绩<60 AND 课程号=
(SELECT 课程号 from c where 课程名= '高等数学')
#接着,更新相应成绩
UPDATE SC as a,(SELECT 学号,课程号 FROM SC WHERE 成绩<60 AND 课程号=
(SELECT 课程号 from c where 课程名= '高等数学')) as b
SET 成绩=60
WHERE a.学号=b.学号
and a.课程号=b.课程号;
#题目:把低于总平均成绩的女同学的成绩提高5%
update sc a
set 成绩=(1+0.05)*成绩
where a.学号 in (select 学号 from s where 性别='女')
and a.成绩 in (select m.成绩 from (select 成绩 from sc where 成绩<(select avg(成绩) from sc) )as m);
注:最后一行体现了上述的“伪装”—把选出的成绩没有直接选择,而是通过命名成新的表m,再行选择
版权声明:本文为qq_43448491原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。