【SQL】实验七 带函数查询和综合查询(2)

一、实验目的

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.请总结经验和教训。

认真,细心,总结

你可能感兴趣的:(SQL,sql,sqlserver,数据库)