目录:
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博客
解题思路大同小异,大家可以对比学习。如有错误,敬请指正,我们一起进步啦!