一、实验目的
1.掌握Management Studio的使用。
2.掌握带函数查询和综合查询的使用。
二、实验内容及要求
1.检索至少选修课程“数据结构”和“C语言”的学生学号。
必须用两个exists语句,刚开始我把选修课程c语言和数据结构放在一个esists语句中,发现没有结果,因为一个课程名不可能满足既等于c语言又等于数据结构,只能把存在的两种可能分别表示出来
select Stu_id
from StudentGrade
where exists (select Course.Course_id from Course,StudentGrade
where Course.Course_id=StudentGrade.Course_id and Course_name='C语言')
and exists(select Course.Course_id from Course,StudentGrade
where Course.Course_id=StudentGrade.Course_id and Course_name='数据结构')
2.列出所有班名、班主任、班长、系名。(请使用连接查询;进一步考虑使用外连接,因为很多班级可能是没有班长的,考虑需要显示所有班级的信息)
select distinct Class_name as 班名,Director as 班主任 ,Monitor as 班长,Depar_name as 系名
from Deparment right join Class on Deparment.Depar_id=Class.Depar_id
3.没有选修以“01”开头的课程的学生学号,姓名,选课的课程号。(用子查询完成,提示not in或not exists。需考虑没选课的学生,仔细对比实验六第5题)
not in
select Student.Stu_id as 学生学号,Stu_name as 学生姓名,Course_id as 选课的课程号
from StudentGrade,Student
where Student.Stu_id=StudentGrade.Stu_id and Course_id not in (select Course_id from StudentGrade where Course_id like '01%')
not exists
select Student.Stu_id as 学生学号,Stu_name as 学生姓名,Course_id as 选课的课程号
from StudentGrade,Student
where Student.Stu_id=StudentGrade.Stu_id and not exists (select Course_id from StudentGrade where Course_id like '01%')
4. 统计各门课程的选修人数,并按人数降序排列,找出排名前三位的课程。(提示:可以使用TOP 3)
select top 3 Course_name,count(Course_name) as 选修人数
from StudentGrade,Course
where Course.Course_id=StudentGrade.Course_id
group by Course_name order by count(Course.Course_name) desc
5. 统计各门课程的选修人数,并按人数降序排列,找出排名前三位的课程。(上述使用TOP 3,却不能处理人数并列的情况。试考虑一种方法能处理人数并列的情况。)
前三名的课程都有一个特点,比他们选修人数多的课程小于3
通过order by将其排序后封装到一个新表中,然后在新表中select distinct 字段 top 3得到前三名,再从前三名中min()出第三名的选修人数,最后select选修人数大于等于第三名的人数的值即可
如下代码可以得出第三名的成绩为32
select min(选修人数) from sequene where 选修人数 in (select DISTINCT top 3 选修人数 from sequene order by 选修人数 desc)
再选择成绩大于等于第三名的成绩即可得到人数并列的前三名
select Course_id,count(*) from StudentGrade,sequene where 选修人数> (select min(选修人数) from sequene where 选修人数 in (select DISTINCT top 3 选修人数 from sequene order by 选修人数 desc) ) group by Course_id,选修人数 order by 选修人数 desc
但这个代码出了问题,得到的结果不对,建议直接使用子查询
另一种方法,在having子句中加入子查询
select Course_id as 课程号,count(*) as 选修人数
from StudentGrade
group by Course_id
having count(*) in(select distinct top 3 count(*)
from StudentCrade
group by Course_id
order by count(*) desc)
order by count(*) desc
6. 检索选修了‘0103’和‘0105’两门课程,并且‘0103’这门课程成绩高于‘0105’的学生的学号。
使用自身连接的方式
select a.Stu_id as 学生学号
from StudentGrade a,StudentGrade b
where a.Stu_id=b.Stu_id and a.Course_id='0103' and b.Course_id='0105' and a.Grade>b.Grade
7. 检索选修了课程“数据结构”和“C语言”两门课程并且“数据结构”分数高于“C语言”的学生学号和姓名。
先外部连接再自身连接
select a.stu_id as 学生学号,Stu_name as 姓名
from StudentGrade a,StudentGrade b,Student
where a.Stu_id=Student.Stu_id and a.Stu_id=b.Stu_id
and a.Course_id in(select Course_id from Course where Course_name='数据结构')
and b.Course_id in(select Course_id from Course where Course_name='C语言')
and a.Grade>b.Grade
三、实验小结
1.请总结经验和教训。
认真,细心,总结