MySQL学习—作业(1)

  • Post author:
  • Post category:mysql

题目是从学校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 版权协议,转载请附上原文出处链接和本声明。