【SQL】cumt 数据库平台实践

目录:

1. 修了老师“王刚”开课课程且成绩在90分以上的学生姓名、课程名称和成绩;

 2. 求选修了“王刚”老师所授全部课程的学生姓名和学院名称;(姓名,学院名称)

 3. 求没有选修课程“软件工程”的学生学号和姓名;(学生学号,姓名)

 4.  求至少选修了两门课程的学生学号;(学号)

 5. 求课程“经济学”不及格学生姓名和考试成绩;(姓名,成绩)

 6. 求至少选修了与学号“T06” 同学选修的课程相同的学生学号;(学号)

 7. 求至少选修了“C3,C4”两门课程的学生姓名和学院名称;(姓名,学院名称)

 8. 查询“王石”同学没有选修的课程号和课程名; (课程号,课程名)

 9. 查询没有被任何学生选修的课程的课程号;(课程号)

 10. 求选修了全部课程的学生姓名;(姓名)

 11. 查询各学院课程“经济学”的平均分,并按照成绩从高到低的顺序排列;(学院名称,平均分)

 12. 查询选修课程“经济学”的学生姓名和所在院系,结果按各院系排列,同时成绩从高到低排列;(姓名,学院名称,成绩)

 13. 求学时在30-45之间(含30和45)的课程的课程号和课程名称及授课教师;(课程号,课程名,教师姓名)

 14. 检索选修课程“经济学”的最高分学生的姓名;(姓名)

 15. 查询选课人数超过5人的课程的课程号及课程名;(课程号,课程名)

题目:

利用脚本文件导入学生管理系统相关的表,结构如下

      学院(学院代码,学院名称)

      学生(学号,姓名,性别,学院代码)

      教师(教师号,教师姓名,学院代码)

      课程(课程号,课程名,学时)

      学习(学号,课程号,教师号,成绩)

      授课(教师号,课程号)

解答:

-- 1.修了老师“王刚”开课课程且成绩在90分以上的学生姓名、课程名称和成绩; 
select 姓名 , 课程名 , 成绩 
from  学生 inner join 学习 on 学生.学号= 学习.学号
inner join 教师 on 学习.教师号=教师.教师号 
inner join 课程 on 课程.课程号= 学习.课程号
where 教师.教师名="王刚" and 学习.成绩>90;



-- 2.求选修了“王刚”老师所授全部课程的学生姓名和学院名称;(姓名,学院名称)
select  姓名 ,学院名称 
from  学生 
inner join 学院 on 学生.学院代码 = 学院.学院代码 
where 学生.学号 in ( 
   select 学号 
   from 学习  
   where not exists(
      select * from  教师 
      inner join 授课 on 教师.教师号=授课.教师号 
      where 教师名="王刚" 
      and not exists(
			select * from 学习 as xx 
            where xx.学号=学习.学号 
            and xx.课程号=授课.课程号 
)     )     );



-- 3.求没有选修课程“软件工程”的学生学号和姓名;(学生学号,姓名)
select distinct 学号 ,姓名 
from  学生 
where 学生.学号  not in 
( select  学号 
  from  学习 inner join 课程 on 学习.课程号= 课程.课程号
  where 课程名="软件工程"
);



-- 4.求至少选修了两门课程的学生学号;(学号)
select distinct s1.学号 
from 学习 as s1 inner join 学习 as s2 on s1.学号=s2.学号
where s1.课程号!= s2.课程号 ; 



-- 5.求课程“经济学”不及格学生姓名和考试成绩;(姓名,成绩)
select 姓名, 成绩 
from 学生 inner join 学习 on 学生.学号=学习.学号
inner join 课程 on 学习.课程号 = 课程.课程号
where 课程名="经济学" and 成绩 <60 ;



-- 6.求至少选修了与学号“T06” 同学选修的课程相同的学生学号;(学号)
 select distinct 学号 
 from 学习 as s1 
 where not exists(
   select  *
   from  学习 as s2 where s2.学号="T06"
   and not exists ( 
      select 课程号 from 学习 as s3 
      where s3.学号 = s1.学号
      and s3.课程号=s2.课程号 )
 );



-- 7.求至少选修了“C3,C4”两门课程的学生姓名和学院名称;(姓名,学院名称)
 select 学生.姓名 ,学院.学院名称
 from  学习 as s1 inner join 学习 as s2 on s1.学号=s2.学号 
 inner join 学生 on s2.学号= 学生.学号
 inner join 学院 on 学生.学院代码=学院.学院代码
 where s1.课程号="C3" and s2.课程号="C4";



-- 8.查询“王石”同学没有选修的课程号和课程名; (课程号,课程名)
select 课程号 , 课程名 
from 课程  where 课程号 not in (
   select 课程号 
   from 学生 inner join 学习 on 学生.学号=学习.学号
   where 姓名="王石"
);



-- 9.查询没有被任何学生选修的课程的课程号;(课程号)
select 课程号 
from 课程 where 课程.课程号 not in (
     select 课程号 from 学习 
);



-- 10.求选修了全部课程的学生姓名;(姓名)
select 姓名 
from 学生 inner join 学习 on 学生.学号=学习.学号 
where not exists(
     select 课程号 
     from 课程 
     where 课程.课程号 not in (
         select 课程号 from 学习 group by 学号 
     ) 
);



-- 11.查询各学院课程“经济学”的平均分,并按照成绩从高到低的顺序排列;(学院名称,平均分)
select  学院名称 , avg(成绩) as '平均分'
from 学院 inner join 学生 on 学院.学院代码=学生.学院代码
inner join 学习 on 学生.学号=学习.学号 
inner join 课程 on 学习.课程号=课程.课程号
where 课程名= "经济学"
group by 学生.学院代码 
order by avg(成绩) desc;



-- 12.查询选修课程“经济学”的学生姓名和所在院系,结果按各院系排列,同时成绩从高到低排列;(姓名,学院名称,成绩)
select 姓名,学院名称,成绩
from 学生,学院,学习,课程
where 学生.学院代码=学院.学院代码
and 学生.学号=学习.学号
and 课程.课程号=学习.课程号
and 课程名='经济学'
order by 成绩 desc;



-- 13.求学时在30-45之间(含30和45)的课程的课程号和课程名称及授课教师;(课程号,课程名,教师姓名)
select 授课.课程号,课程名,教师名
from 授课,课程,教师
where 授课.课程号=课程.课程号
and 授课.教师号=教师.教师号
and 学时 between 30 and 45;



-- 14.检索选修课程“经济学”的最高分学生的姓名;(姓名)
select 姓名
from 学生, 学习, 课程
where 学生.学号=学习.学号
and 学习.课程号=课程.课程号
and 课程名="经济学"
order by 成绩 desc
limit 1;



-- 15.查询选课人数超过5人的课程的课程号及课程名;(课程号,课程名)
select 课程.课程号, 课程名 
from 学习,课程
where 学习.课程号=课程.课程号
group by 课程号 having count(学号) >5 ;

大家在写关于除的语句时要注意一下各个集合间的关系。

作者是个小白,自己做题时有参考以下文章:

(102条消息) CUMT数据库SQL实验_Pc clienter的博客-CSDN博客

解题思路大同小异,大家可以对比学习。如有错误,敬请指正,我们一起进步啦!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值