实验:数据库综合查询(13页).doc
-实验六:数据库综合查询一、实验目的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,'课程号'=course.Cno,'课程名'=course.CnameFROM student,course,scWHEREstudent.Sno=sc.Sno ANDcourse.Cno=sc.Cno ANDSUBSTRING(LTRIM(student.Sname),2,1)='阳'3. 列出选修了数学或者大学英语的学生学号、姓名、所在院系、选修课程号及成绩;USE studentSELECT'学号'=student.Sno,'姓名'=student.Sname,'所在院系'=student.Sdept,'课程号'=sc.Cno,'成绩'=sc.GradeFROM student,course,scWHEREstudent.Sno=sc.Sno ANDcourse.Cno=sc.Cno AND(course.Cname='数学' OR course.Cname='大学英语')4. 查询缺少成绩的所有学生的详细情况;USE studentSELECT student.*FROM student,scWHEREstudent.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.Sno,'姓名'=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 course.Ccredit*1 ELSE 0 END)FROM student,sc,courseWHERE sc.Sno=student.Sno AND sc.Cno=course.CnoGROUP BY student.Sno,student.Sname,student.Sdept8. 列出只选修一门课程的学生的学号、姓名、院系及成绩;USE studentSELECT'学号'=student.Sno,'姓名'=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,'课程号'=sc.CnoFROM student,scWHERE student.Sno=sc.Sno ANDstudent.Sname!='张力' ANDsc.Cno=ANY(SELECT sc.Cno FROM sc,student WHERE sc.Sno=student.Sno AND student.Sname='张力')10. 只选修“数据库”和“数据结构”两门课程的学生的基本信息;USE studentSELECT'学号'=student.Sno,'姓名'=student.Sname,'学院'=student.Sdept,'选修课程'=course.CnameFROM student,sc,course,course bWHERE student.Sno=sc.Sno ANDcourse.Cno=sc.Cno ANDb.Cno=course.Cno AND(sc.Sno=ANY(SELECT Sno FROM sc GROUP BY Sno HAVING COUNT(Cno)=1) AND(course.Cname='数据库' OR course.Cname='数据结构')OR(sc.Sno=ANY(SELECT Sno FROM sc GROUP BY Sno HAVING COUNT(Cno)=2) ANDb.Cname='数据库' AND course.Cname='数据结构')11. 至少选修“数据库”或“数据结构”课程的学生的基本信息;USE studentSELECT DISTINCT'学号'=student.Sno,'姓名'=student.Sname,'学院'=student.SdeptFROM student,scWHERE student.Sno=sc.Sno ANDsc.Sno=ANY(SELECT sc.SnoFROM course,scWHERE course.Cno=sc.Cno AND(course.Cname='数据库' OR course.Cname='数据结构')12. 列出所有课程被选修的详细情况,包括课程号、课程名、学号、姓名及成绩;USE studentSELECT'课程号'=sc.Cno,'课程名'=course.Cname,'学号'=sc.Sno,'姓名'=student.Sname,'成绩'=sc.GradeFROM sc,course,studentWHERE sc.Cno=course.Cno AND sc.Sno=student.SnoORDER BY sc.Cno ASC13. 查询只被一名学生选修的课程的课程号、课程名;USE studentSELECT'课程号'=sc.Cno,'课程名'=course.CnameFROM sc,courseWHERE sc.Cno=course.CnoGROUP BY sc.Cno,course.CnameHAVING COUNT(sc.Sno)=1ORDER BY sc.Cno ASC14. 检索所学课程包含学生张向东所学课程的学生学号、姓名;USE studentSELECT DISTINCT'学号'=sc.Sno,'姓名'=student.SnameFROM sc,studentWHERE sc.Sno=student.Sno ANDstudent.Sname!='张向东' ANDsc.Cno=ANY(SELECT sc.Cno 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 ANDsc.Cno=course.Cno ANDsc.Sno=ANY(SELECT sc.Sno FROM sc,course WHERE sc.Cno=course.Cno AND course.Cname='数据结构')16. 使用嵌套查询查询其它系中年龄小于CS系的某个学生的学生姓名、年龄和院系;USE studentSELECT'姓名'=Sname,'年龄'=Sage,'院系'=SdeptFROM studentWHERE Sdept!='CS' AND Sage<ANY(SELECT TOP 4 Sage FROM 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 sc.Cno='1'INTERSECTSELECT student.*FROM student,scWHERE sc.Sno=student.Sno AND sc.Cno='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 course.CnameFROM sc,courseWHERE sc.Cno=course.Cno AND sc.Sno=TmpSno),'第二门'=(SELECT TOP 2 course.CnameFROM sc,courseWHERE sc.Cno=course.Cno AND sc.Sno=TmpSnoEXCEPT SELECT TOP 1 course.CnameFROM sc,courseWHERE sc.Cno=course.Cno AND sc.Sno=TmpSno),'第三门'=(SELECT TOP 3 course.CnameFROM sc,courseWHERE sc.Cno=course.Cno AND sc.Sno=TmpSnoEXCEPT SELECT TOP 2 course.CnameFROM sc,courseWHERE sc.Cno=course.Cno AND sc.Sno=TmpSno),'第四门'=(SELECT TOP 4 course.CnameFROM sc,courseWHERE sc.Cno=course.Cno AND sc.Sno=TmpSnoEXCEPT SELECT TOP 3 course.CnameFROM sc,courseWHERE sc.Cno=course.Cno AND sc.Sno=TmpSno),'第五门'=(SELECT TOP 5 course.CnameFROM sc,courseWHERE sc.Cno=course.Cno AND sc.Sno=TmpSnoEXCEPT SELECT TOP 4 course.CnameFROM sc,courseWHERE sc.Cno=course.Cno AND sc.Sno=TmpSno)FROM studentWHERE Sno=TmpSnoSET SNumber=SNumber+1END六、出现问题及解决办法如:某些查询操作无法执行,如何解决?-第 13 页-