实验五 连接查询和嵌套查询
一、实验目的
1.掌握Management Studio的使用。
2.掌握SQL中连接查询和嵌套查询的使用。
二、实验内容及要求(请同学们尝试每道题均使用连接和嵌套两种方式来进行查询,如果可以的话)
1. 找出所有任教“数据库”的教师的姓名。
select distinct teac_name
from teacher join CourseTeacher on teacher.Teac_id=CourseTeacher.Teac_id
join Course on Course.Course_id=CourseTeacher.Course_id
where Course_name=‘数据库’
select distinct teac_name
from Teacher
where Teac_id in (select Teac_id
from CourseTeacher
where Course_id = (select Course_id
from course
where Course_name=‘数据库’))
2. 取出学号为“980101011”的学生选修的课程号和课程名。
select Course.Course_id,Course.Course_name
from Course join StudentGrade on StudentGrade.Course_id=Course.Course_id
where StudentGrade.Stu_id=‘980101011’
select Course_id,Course_name
from Course
where Course_id in (select Course_id
from StudentGrade
where Stu_id=‘980101011’)
3.“涂杰杰”所选修的全部课程号及成绩。(注意:school中有同名,即有两名学生叫“涂杰杰”。)
select StudentGrade.Course_id,Grade
from Student join StudentGrade on Student.Stu_id=StudentGrade.Stu_id
where Stu_name=‘涂杰杰’
select course_id,grade
from StudentGrade
where Stu_id in
(select Stu_id
from Student
where Stu_name=‘涂杰杰’)
4.找出“苏贤兴”同学所学课程的名称和成绩。(请使用连接查询和嵌套查询分别来完成)
select distinct StudentGrade.Grade,Course.Course_name
from Course join StudentGrade on StudentGrade.Course_id=Course.Course_id
join Student on Student.Stu_id=StudentGrade.Stu_id
where Stu_name=‘苏贤兴’
select StudentGrade.Grade,Course_name
from Course join StudentGrade on Course.Course_id=StudentGrade.Course_id
where stu_id in
(select Stu_id
from Student
where Stu_name=‘苏贤兴’)
5.显示所有课程的选修情况(外连接)。
–count(*)为统计有多少行(记录),count与studentgrade左连接后,每门课程都至少有一行(记录)
select course_name,count(Stu_id) as 选修人数
from course left join StudentGrade
on course.Course_id=StudentGrade.Course_id
group by Course_name
6.检索选修课程号为“0109”或“0111”的学生学号、姓名和所在班级。
select student.Stu_id,stu_name,class_id
from Student join StudentGrade
on Student.Stu_id=StudentGrade.Stu_id
where Course_id in (‘0109’,‘0111’)
select student.Stu_id,stu_name,class_id
from Student
where Stu_id in
(select Stu_id
from StudentGrade
where Course_id in (‘0109’,‘0111’))
7.查询“0203”课程的最高分的学生的学号。
select top 1 stu_id
from StudentGrade
where Course_id=‘0203’
order by Grade desc
8.没有选修以“01”开头的课程的学生信息。(用子查询完成,提示not in或not exists。需考虑没选课的学生)
select *
from student
where Stu_id not in
(select Stu_id
from StudentGrade
where Course_id like ‘01%’)
三、实验小结
1.思考简单查询、连接查询与嵌套查询有什么不同?连接查询与嵌套查询有何区别与联系?
简单查询:查询只涉及一个表
连接查询:查询涉及两个或两个以上的表
嵌套查询:又称为子查询,指在父查询的where条件语句中再插入一个子查询语句
1、意义上的差异
嵌套查询是包含一个或多个子查询或子查询的另一个术语的select语句。在外部查询中包含内部查询的另一个子查询是SQL语句的扩展。
连接查询是关系数据库中最重要的查询。在关系数据库管理系统中,数据之间的关系不需要确定表的建立时间,实体的所有信息通常都存储在表中。检索数据时,通过连接操作查询存储在多个表中的不同实体的信息。
2、特征上的差异
嵌套查询的主要特点是sql允许从内到外进行多层嵌套分析,并将子查询的结果作为主查询的查询条件。
连接是关系数据库模型的主要特征。多表查询可以通过连接运算符实现。连接操作给用户带来极大的灵活性,可以随时添加新的数据类型。
2.此次实验中得到的哪些经验教训、疑难问题?有什么心得或总结?
在第5题,显示所有课程的选修情况(外连接)。Count(stu_id)与count(*)是不同的,
count(*)为统计有多少行(记录),count与studentgrade左连接后,每门课程都至少有一行(记录)