大连海事大学
数据库原理课程实验报告(2013-2014学年第二学期)
实验四高级查询
班级:软件工程四班
学号:2220121787
姓名:马跃
指导教师:曹志英
成绩:
大连海事大学软件工程系
2014年6 月23 日
目录
1实验目的 (3)
2实验内容 (3)
2.1掌握SQL高级查询使用方法 (3)
3实验要求 (3)
4实验步骤 (3)
4.1掌握SQL高级查询使用方法 (3)
5总结与体会 (6)
5.1实验中出现的问题及其解决方案 (6)
5.2总结 (7)
5.3体会 (7)
1实验目的
(1)掌握SQL的高级查询的使用方法,如分组统计、嵌套查询、集合查询等等。
2实验内容
2.1 掌握SQL高级查询使用方法
(1)分组统计。
(2)嵌套查询,包括IN查询、EXISTS查询。
(3)集合查询。
3实验要求
(1)深入复习教材第三章SQL有关高级查询语句。
(2)根据书上的例子,针对DBTestBed数据库模式设计分组统计查询、嵌套查询(IN、EXISTS)语句和集合查询语句,每种类型的基本查询至少要设计一个查询,描述清楚查询要求,运行你所设计的查询语句,并截图相应的实验结果,每幅截图并要有较为详细的描述。
也可以按照附1所列示例查询做实验。
(3)实验步骤和实验总结中要详细描述实验过程中出现的问题、原因和解决方法。
4实验步骤
4.1 掌握SQL高级查询使用方法
(1)不带分组过滤条件的分组统计查询。
统计2013-2014上学期信息学院(01)开设的每门课程的最高分,最低分,及平均成绩。
select C.coursename,avg(score)AVGS,max(score)MAXS,min(score)MINS from tb_select_course A,Tb_Cultivate_Scheme B,Tb_Course_info C
where A.schemeid=B.schemeid and B.cyear='2013'and B.term='上'and
C.courseid=B.courseid and C.deptid='01'
group by C.coursename
(2)带分组过滤条件的分组统计查询。
查询选修了1门以上课程的学生学号,姓名,年级,专业名称
select A.graduateid,graduatename,grade,specialityname
from tb_student_info A,tb_speciality_info B,tb_select_course C
where A.specialityid=B.specialityid and C.graduateid=A.graduateid group by A.graduateid,A.graduatename,grade,specialityname
having count(A.graduateid)>1
(3)单层IN查
查询学号为’1787’的学生信息。
select A.graduateid,graduatename,sex,city,email,tel,birthday
from tb_student_info A
where graduateid in(
select graduateid
from tb_student_info D
where D.graduateid='1787')
(4)IN嵌套查询。
查询“信息科学技术学院”学生姓名和学号和家庭地址。
select graduateid,graduatename,city
from tb_student_info
where specialityid in
(select specialityid
from tb_speciality_info
where deptid in
(select deptid
from tb_dept_info
where deptname='信息科学技术学院'
)
)
(5)带有比较运算符的子查询
查询指导教师为“曹志英”的所有学生学号姓名和电话。
select graduateid,graduatename,tel
from tb_student_info
where tutorid=
(select tutorid
from tb_tutor_info
where tutorname='曹志英'
)
(6)单层EXISTS嵌套查询。
所有选修培养方案号(SchemeID)为3的学生姓名
select graduatename
from tb_student_info A
where exists
(select*
from tb_select_course B
where B.schemeid='01'and A.graduateid=B.graduateid
)
(7)双层EXISTS嵌套查询。
查询选修了全部课程的学生姓名
select graduatename
from tb_student_info A
where not exists
(select*
from tb_course_info B,tb_cultivate_scheme D
where B.courseid=D.courseid and not exists
(select*
from tb_select_course C
where graduateid=A.graduateid and
schemeid=D.schemeid
))
(8)集合查询(交、并、差各设计一个)。
查询“曹志英”老师和“宗雪飘”老师都授过课的学生姓名学号。
select graduatename,A.graduateid
from tb_student_info A,tb_select_course B
where A.graduateid=B.graduateid and B.teacher='01'
union
select graduatename,A.graduateid
from tb_student_info A,tb_select_course B
where A.graduateid=B.graduateid and B.teacher='02'
查询“曹志英”老师和“宗雪飘”老师授过课的所有学生姓名学号。
select graduatename,A.graduateid
from tb_student_info A,tb_select_course B
where A.graduateid=B.graduateid and B.teacher='01'
intersect
select graduatename,A.graduateid
from tb_student_info A,tb_select_course B
where A.graduateid=B.graduateid and B.teacher='02'
查询选修过“曹志英”老师的课程,却没有听过“宗雪飘”课程的学生姓名学号。
select graduatename,A.graduateid
from tb_student_info A,tb_select_course B
where A.graduateid=B.graduateid and B.teacher='01'
except
select graduatename,A.graduateid
from tb_student_info A,tb_select_course B
where A.graduateid=B.graduateid and B.teacher='02'
5总结与体会
5.1 实验中出现的问题及其解决方案
在group by查询学号姓名时没有将,没有将姓名放在group by语句中,结果出现查询不正确,最后请教老师,在group by分组时应将查询的内容都包含。
5.2 总结
感觉这个实验相对于上几个实验比较难,尤其是双层EXISTS嵌套查询,自己的理解还不是很到位,但是慢慢参考书上的例子,将代码写了出来。
5.3 体会
感觉自己自己学习的数据库还不是很踏实,还应该继续努力脚踏实地,不要急于求成,自己不会时应该多向同学老师请教。