当前位置:文档之家› 实验:数据库综合查询

实验:数据库综合查询

实验六:数据库综合查询一、实验目的1.掌握SELECT语句的基本语法和查询条件表示方法;2.掌握查询条件种类和表示方法;3.掌握连接查询的表示及使用;4.掌握嵌套查询的表示及使用;5.了解集合查询的表示及使用。

二、实验环境已安装SQL Server 2005 企业版的计算机(13台);具有局域网环境,有固定IP;三、实验学时2学时四、实验要求1.了解SELECT语句的基本语法格式和执行方法;2.了解连接查询的表示及使用;3.了解嵌套查询的表示及使用;4.了解集合查询的表示及使用;5.完成实验报告;五、实验内容及步骤以数据库原理实验5数据为基础,请使用T-SQL 语句实现进行以下操作:1.查询以‘DB_’开头,且倒数第3个字符为‘s’的课程的详细情况;USE studentSELECT'课程号'=Cno,'课程名'=Cname,'先行课号'=Cpno,'学分'=CcreditFROM courseWHERESUBSTRING(Cname,1,3)='DB_'ANDSUBSTRING(RIGHT(RTRIM(Cname),3),1,1)='s'2.查询名字中第2个字为‘阳’的学生姓名和学号及选修的课程号、课程名;USE studentSELECT'姓名'=student.Sname,'学号'=student.Sno,'课程号'=o,'课程名'=ameFROM student,course,scstudent.Sno=sc.Sno ANDo=o ANDSUBSTRING(LTRIM(student.Sname),2,1)='阳'3.列出选修了‘数学’或者‘大学英语’的学生学号、姓名、所在院系、选修课程号及成绩;USE studentSELECT'学号'=student.Sno,'姓名'=student.Sname,'所在院系'=student.Sdept,'课程号'=o,'成绩'=sc.GradeFROM student,course,scWHEREstudent.Sno=sc.Sno ANDo=o AND(ame='数学'OR ame='大学英语')4.查询缺少成绩的所有学生的详细情况;USE studentSELECT student.*FROM student,scstudent.Sno=sc.Sno ANDsc.Grade IS NULL5.查询与‘张力’(假设姓名唯一)年龄不同的所有学生的信息;USE studentSELECT*FROM studentWHERESname!='张力'ANDSage!=(SELECT Sage FROM student WHERE Sname='张力')6.查询所选课程的平均成绩大于张力的平均成绩的学生学号、姓名及平均成绩;USE studentDECLARE @ZL_AVG INTSET @ZL_AVG=(SELECT AVG(sc.Grade)FROM sc,studentWHERE sc.Sno=student.Sno AND student.Sname='张力'GROUP BY sc.Sno,student.Sno)SELECT DISTINCT'姓名'=student.Sname,'平均成绩'=AVG(sc.Grade)FROM student,scWHERE sc.Sno=student.SnoGROUP BY sc.Sno,student.Sno,student.SnameHAVING AVG(sc.Grade)>@ZL_AVG7.按照“学号,姓名,所在院系,已修学分”的顺序列出学生学分的获得情况。

其中已修学分为考试已经及格的课程学分之和;USE studentSELECT DISTINCT'学号'=student.Sno,'姓名'=student.Sname,'所在院系'=student.Sdept,'已修学分'=SUM(CASE WHEN sc.Grade>=60 THEN redit*1 ELSE0 END) FROM student,sc,courseWHERE sc.Sno=student.Sno AND o=oGROUP BY student.Sno,student.Sname,student.Sdept8.列出只选修一门课程的学生的学号、姓名、院系及成绩;USE studentSELECT'姓名'=student.Sname,'院系'=student.Sdept,'成绩'=sc.GradeFROM student,scWHERE student.Sno=sc.Sno ANDstudent.Sno=ANY(SELECT Sno FROM sc GROUP BY Sno HAVING COUNT(Cno)=1)9.查找选修了至少一门和张力选修课程一样的学生的学号、姓名及课程号;USE studentSELECT'学号'=student.Sno,'姓名'=student.Sname,'课程号'=oFROM student,scWHERE student.Sno=sc.Sno ANDstudent.Sname!='张力'ANDo=ANY(SELECT o FROM sc,student WHERE sc.Sno=student.Sno AND student.Sname='张力')10.只选修“数据库”和“数据结构”两门课程的学生的基本信息;USE studentSELECT'学号'=student.Sno,'姓名'=student.Sname,'选修课程'=ameFROM student,sc,course,course bWHERE student.Sno=sc.Sno ANDo=o ANDo=o AND((sc.Sno=ANY(SELECT Sno FROM sc GROUP BY Sno HAVING COUNT(Cno)=1) AND(ame='数据库'OR ame='数据结构'))OR(sc.Sno=ANY(SELECT Sno FROM sc GROUP BY Sno HAVING COUNT(Cno)=2) ANDame='数据库'AND ame='数据结构'))11.至少选修“数据库”或“数据结构”课程的学生的基本信息;USE studentSELECT DISTINCT'学号'=student.Sno,'姓名'=student.Sname,'学院'=student.SdeptFROM student,scWHERE student.Sno=sc.Sno ANDsc.Sno=ANY(SELECT sc.SnoFROM course,scWHERE o=o AND(ame='数据库'OR ame='数据结构'))12.列出所有课程被选修的详细情况,包括课程号、课程名、学号、姓名及成绩;USE studentSELECT'课程号'=o,'课程名'=ame,'学号'=sc.Sno,'姓名'=student.Sname,'成绩'=sc.GradeFROM sc,course,studentWHERE o=o AND sc.Sno=student.Sno ORDER BY o ASC13.查询只被一名学生选修的课程的课程号、课程名;USE studentSELECT'课程号'=o,'课程名'=ameFROM sc,courseWHERE o=oGROUP BY o,ameHAVING COUNT(sc.Sno)=1ORDER BY o ASC14.检索所学课程包含学生‘张向东’所学课程的学生学号、姓名;USE studentSELECT DISTINCT'学号'=sc.Sno,'姓名'=student.SnameFROM sc,studentWHERE sc.Sno=student.Sno ANDstudent.Sname!='张向东'ANDo=ANY(SELECT o FROM sc,studentWHERE sc.Sno=student.Sno AND student.Sname='张向东')15.使用嵌套查询列出选修了“数据结构”课程的学生学号和姓名;USE studentSELECT DISTINCT'学号'=sc.Sno,'姓名'=student.SnameFROM sc,student,courseWHERE sc.Sno=student.Sno ANDo=o ANDsc.Sno=ANY(SELECT sc.Sno FROM sc,course WHERE o=o AND ame='数据结构')16.使用嵌套查询查询其它系中年龄小于CS系的某个学生的学生姓名、年龄和院系;USE studentSELECT'姓名'=Sname,'年龄'=Sage,'院系'=SdeptFROM studentWHERE Sdept!='CS'AND Sage<ANY(SELECT TOP4 SageFROM student WHERE Sdept='CS')17.使用ANY、ALL 查询,列出其他院系中比CS系所有学生年龄小的学生;USE studentSELECT*FROM studentWHERE Sdept!='CS'AND Sage<ALL(SELECT Sage FROM student WHERE Sdept='CS')18.分别使用连接查询和嵌套查询,列出与‘张力’在一个院系的学生的信息;连接:USE studentSELECT a.*FROM student a,student bWHERE a.Sdept=b.Sdept AND a.Sname!='张力'AND b.Sname='张力'嵌套:USE studentSELECT*FROM studentWHERE Sdept=ALL(SELECT Sdept FROM student WHERE Sname='张力')AND Sname!='张力'19.使用集合查询列出CS系的学生以及性别为女的学生名单;USE studentSELECT*FROM studentWHERE Sdept='CS'UNIONSELECT*FROM studentWHERE Ssex='女'ORDER BY Sdept,Ssex ASC20.使用集合查询列出CS系的学生与年龄不大于19岁的学生的交集、差集;USE studentSELECT*FROM studentWHERE Sdept='CS'EXCEPTSELECT*FROM studentWHERE Sage>19ORDER BY Sage ASCGOSELECT*FROM studentWHERE Sdept='CS'EXCEPTSELECT*FROM studentWHERE Sage!>19ORDER BY Sage ASC21.使用集合查询列出选修课程1的学生集合与选修课程2的学生集合的交集;USE studentSELECT student.*FROM student,scWHERE sc.Sno=student.Sno AND o='1'INTERSECTSELECT student.*FROM student,scWHERE sc.Sno=student.Sno AND o='2'22.思考题:按照课程名顺序显示各个学生选修的课程(如200515001 数据库数据结构数学);一种笨拙的循环方法:USE studentDECLARE @SNumber INTDECLARE @TmpSno INTSET @SNumber=0WHILE @SNumber<15BEGINSET @TmpSno=(SELECT DISTINCT TOP(@SNumber+1) SnoFROM scEXCEPT SELECT DISTINCT TOP(@SNumber) SnoFROM sc)SELECT'学号'=Sno,'姓名'=Sname,'第一门'=(SELECT TOP 1 ameFROM sc,courseWHERE o=o AND sc.Sno=@TmpSno),'第二门'=(SELECT TOP 2 ameFROM sc,courseWHERE o=o AND sc.Sno=@TmpSnoEXCEPT SELECT TOP 1 ameFROM sc,courseWHERE o=o AND sc.Sno=@TmpSno),'第三门'=(SELECT TOP 3 ameFROM sc,courseWHERE o=o AND sc.Sno=@TmpSnoEXCEPT SELECT TOP 2 ameFROM sc,courseWHERE o=o AND sc.Sno=@TmpSno), '第四门'=(SELECT TOP 4 ameFROM sc,courseWHERE o=o AND sc.Sno=@TmpSnoEXCEPT SELECT TOP 3 ameFROM sc,courseWHERE o=o AND sc.Sno=@TmpSno), '第五门'=(SELECT TOP 5 ameFROM sc,courseWHERE o=o AND sc.Sno=@TmpSnoEXCEPT SELECT TOP 4 ameFROM sc,courseWHERE o=o AND sc.Sno=@TmpSno) FROM studentWHERE Sno=@TmpSnoSET @SNumber=@SNumber+1END六、出现问题及解决办法如:某些查询操作无法执行,如何解决?。

相关主题