SQL实验二数据库查询实验报告.docx
《SQL实验二数据库查询实验报告.docx》由会员分享,可在线阅读,更多相关《SQL实验二数据库查询实验报告.docx(10页珍藏版)》请在冰豆网上搜索。
SQL实验二数据库查询实验报告
实验二数据库的查询实验
实验目的和要求
(1)掌握SQLServer查询分析器的使用方法,加深对SQL和Transact-SQL语言的查询语句的理解。
(2)熟练掌握简单表的数据查询、数据排序和数据连接查询的操作方法。
(3)熟练掌握数据查询中的分组、统计、计算和组合的操作方法。
实验内容和原理
在实验一定义的“学生成绩数据库”中,使用T-SQL语句完成以下查询:
(1)求计算机系学生的学号和姓名。
(2)求选修了数学的学生学号、姓名和成绩。
(3)求选修01课程的学生学号和成绩,并要求对查询结果按成绩降序排列,如果成绩相同则按学号升序排列。
(4)查找选修课程的平均成绩位于前三名的学生的学号。
(5)查询计算机系的姓刘且单名的学生的信息。
(6)查询至少选修两门课程的学生学号。
(7)查询学生的学号、课程号以及对应成绩与所有学生所有课程的最高成绩的百分比。
(8)查询选修“数据库”课程,且成绩在80分以上的学生的学号和成绩。
(9)查询所有姓“王”的同学没有选修的课程名。
(请分别用exists和in完成该查询)
(10)查询选修了全部课程的学生的姓名。
(请至少写出两种查询语句)
(11)求选修了学生“95001”所选修的全部课程的学生学号和姓名。
(12)查询每一门课的间接先修课。
(13)列出所有学生所有可能的选课情况。
(14)列出每个学生的学号及选修课程号,没有选修的学生的学号也一并列出。
(15)输出与“张三”同性别并位于同一个系的所有同学的姓名。
(请至少写出两种
查询语句)
(16)查询至少被两名男生选修的课程名。
(17)对被两名以上学生所选修的课程统计每门课的选课人数。
要求输出课程号和选修人数,查询结果按人数降序排列;若人数相同,按课程号升序排列。
(18)列出选修课程超过3门的学生姓名及选修门数。
(19)检索至少选修课程号为01和03的学生姓名。
(20)检索至少选修课程“数学”和“操作系统”的学生学号。
(21)查询‘操作系统'课程的最高分的学生的姓名、性别、所在系
(22)查询数据结构的成绩低于操作系统的成绩的学生姓名及该生的这两门课的成绩
(23)所有成绩都在70分以上的学生姓名及所在系。
三、实验环境
四、实验方法
1.将查询需求用Transact-SQL语言表示。
2.
在SQLServer查询分析器的输入区中输入
于TSQL语句的执行结果,在结果区中可以有4种不同的输出形式:
标准执行将
结果直接显示在结果区:
网格执行将结果以表格形
式显示在结果区;计划执行显示执行计划;索引分析为在结果区中显示查询的索引情况。
述输出形式,可以通过菜单或按钮选择。
五、调试过程
五、实验结果
六、总结
附录:
--
(1)求计算机系学生的学号和姓名
selectsno,sname
fromstudent
wheresdept='计算机'--
(2)求选修了数学的学生学号、姓名和成绩
selects.sno,sname,grade
wheres.sno二sc.snoandsc.eno二c.enoandcname='数学
学号升序排
--(3)求选修课程的学生学号和成绩,并要求对查询结果按成绩降序排列,如果成绩相同则按
列。
selectsno,gradefromscwherecno='1'orderbygradedesc,snoasc--(4)查找选修课程的平均成绩位于前三名的学生的学号。
selecttop3snofromscgroupbysnoorderbyavg(grade)desc
--(5)查询计算机系的姓刘且单名的学生的信息。
select*
fromstudent
wheresdept='计算机'andsnamelike'刘_'--(6)查询至少选修两门课程的学生学号。
selectsnofromscgroupbysnohavingcount(*)>=2--(7)查询学生的学号、课程号以及对应成绩与所有学生所有课程的最高成绩的百分比。
selectsno,cno,grade,最高成绩百分比=grade*100/(selectmax(grade)fromsc)fromsc
selectsno,gradefromcoursec,
--(8)查询选修“数据库”课程,且成绩在分以上的学生的学号和成绩sc
wherecname='数据库'andgrade>80andc.cno=sc.cno
--(9)查询所有姓王”的同学没有选修的课程名。
(请分别用exists和in完成该查询)
--exists方法
selectcname
fromcoursec
wherenotexists
(
selects.sno
fromstudents,sc
wheres.sno=sc.snoandsnamelike'王%'andc.cno=sc.cno)
--in方法
selectcnamefromcoursecwherecnonotin(
selectcno
fromstudents,sc
wheres.sno=sc.snoandsnamelike'王%'andc.cno=sc.cno)
--(10)查询选修了全部课程的学生的姓名。
(请至少写出两种查询语句)
--法一selectSnamefromstudentswherenotexists
(
select*fromcoursecwherenotexists
(
select*
fromsc
wheresno=s.snoandcno=c.cno
)
)
selectSnamefromstudentswhere
selectcount(*)
fromsc
wheresno=s.sno
)=(selectcount(*)fromcourse)
--法三selectSnamefromstudentwhereSnoin
(
selectSnofromscgroupbysno
havingcount(*)=(selectcount(*)fromcourse))
--(11)求选修了学生“”所选修的全部课程的学生学号和姓名selects.sno,snamefromstudents,scwheresc.cnoin
(selectcno
fromsc
wheresno='95001'
)ands.sno=sc.sno
groupbys.sno,sname
havingcount(cno)=(selectcount(cno)
fromsc
wheresno='95001')ands.sno!
='95001'
--(12)查询每一门课的间接先修课。
selectc1.cno,c2.cpno
fromcoursec1,coursec2
wherec1.cpno=c2.cno
--(13)列出所有学生所有可能的选课情况。
selects.sno,s.sname,c.cno,c.cname
fromstudentscrossjoincoursec
--(14)列出每个学生的学号及选修课程号,没有选修的学生的学号也一并列出。
selects.sno,sc.cno
fromstudentsleftouterjoinsc
ons.sno=sc.sno
--(15)输出与“张三”同性别并位于同一个系的所有同学的姓名。
(请至少写出两种查询语句)
--法一
selectsname
fromstudent
wheresdeptin
(
selectsdept
fromstudent
wheresname='张三'andssex=(selectssexfromstudentwheresname=张三')
)
groupbysname
havingsname!
='张三'
selectsnamefromstudentwheresdept=(
selectsdeptfromstudent
sname=
wheresname='张三'andssex=(selectssexfromstudentwhere张三'))groupbysnamehavingsname!
='张三
--(16)查询至少被两名男生选修的课程名。
selectcname
fromcoursec,students,sc
wheressex='男'andc.cno=sc.cnoands.sno=sc.snogroupbycnamehavingcount(*)>=2--(17)对被两名以上学生所选修的课程统计每门课的选课人数。
--要求输出课程号和选修人数,查询结果按人数降序排列;若人数相同,按课程号升序排列selectcno,count(*)as'选修人数'
fromsc
groupbycno
havingcount(*)>2
orderby'选修人数'desc,cnoasc--(18)列出选修课程超过门的学生姓名及选修门数。
selectsname,count(*)as'选修门数'fromstudents,sc
wheres.sno=sc.snogroupbys.sno,snamehavingcount(*)>3
--(19)检索至少选修课程号为和的学生姓名。
selectsname
fromstudent
wheresnoin
(
selects1.snofromscs1,scs2
wheres1.cno='1'ands2.cno='3'ands1.sno=s2.sno
)
--(20)检索至少选修课程“数学”和“操作系统”的学生学号。
selectsc.sno
wherec.cname='数学'andc.eno二sc.enoandsnoin
(
selectsc.sno
fromsc,coursec
wherec.cname='操作系统
)
'and
c.eno二sc
eno
--(21)查询
操作系统'课程的最高分的学生的姓名、
性别、
所在系
selectsname
ssex,sdept
fromstudents
sc
wheres.sno
and
=sc.sno(grade=
selectmax(grade)
fromcoursec,sc
--(22)查询数据结构的成绩低于操作系统的成绩的学生姓名及该生的这两门课的成绩
select
si.sname,sc1.grade
as'
操作系统成绩',sc2.
gradeas'数据结构成绩
from
courseci
coursec2,
scsei
sc2,studentsi
students2
where
ci.ename
='操作系统'
andc2
.ename='数据结构'
andsei
.grade>sc2.
grade
andsei
.sno二sc2.sno
andci.
eno二sci.eno
and
c2.eno二sc2.eno
andsi.
sno二sci.sno
and
s2.sno二sc2.sno
--(23)所有成绩都在分以上的学生姓名及所在系selectsname,sdeptfromstudents,sc
wheres.sno二sc.snogroupbysname,sdept