数据库原理-实验五 连接查询和嵌套查询

数据库原理-实验五 连接查询和嵌套查询_第1张图片
数据库原理-实验五 连接查询和嵌套查询_第2张图片

数据库原理-实验五 连接查询和嵌套查询_第3张图片

实验五 连接查询和嵌套查询
一、实验目的
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左连接后,每门课程都至少有一行(记录)

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