内容正文:
数据库表数据的操纵
第四章
1
目 录
2
4.1 单表查询
4.2 分组统计查询
4.3 多表连接查询
4.4 嵌套查询
4.5 数据更新
4.6 查询优化——索引
4.4 嵌套查询
掌握使用子查询的方法。
知识目标
会在查询中使用子查询。
能力目标
5
课程信息统计
教务处邓老师负责各班级的课程安排工作。她每学期都需要对各门课程的相关信息做统计分析,以便及时了解学生的学习情况及教师授课的情况。
查询所有开设C语言课程的班级学生名单,提供学号、姓名及班级编号。
查询2017-2018-1学期各位教师的任课信息,提供教师编号、教师姓名、课程名称及课时。
查询课时数高于所有课程平均课时数的课程信息。
查询成绩不及格及有缺考情况的课程相关信息,提供班级名称、学号、姓名、课程名称及成绩。
查询平均分高于80分的课程相关信息,提供班级编号、课程名称、任课教师姓名及平均分。
、
任务描述
6
查询所有开设C语言课程的班级学生名单,提供学号、姓
名及班级编号。
此任务需要两层嵌套实现。在course表中先确定c语言课程的课程编号集合,再通过score表找到选修该课程的学生的学号集合,最后在student表中获取相关信息。也可采用三表连接查询。
2. 查询2017-2018-1学期各位教师的任课信息,提供教师编号、教师姓名、课程名称及课时。
此任务采用三表连接查询。将course、teach和teacher三表连接后得到查询结果集,设置行选择条件,然后指定查询输出目标字段。
课程信息统计
任务分析
3. 查询课时数高于所有课程平均课时数的课程信息。
此任务采用嵌套查询。子查询先从course表中查询出所有课程的平均课时数,再将其作为外查询的条件,通过关系运算符“>”设置关系表达式。
4. 查询成绩不及格及有缺考情况的课程相关信息,提供班级名称、学号、姓名、课程名称及成绩。
此任务涉及student、score、course和class共四个表,四表连接后设置行选择条件,然后指定查询输出目标字段。
查询平均分高于80分的课程相关信息,提供班级编号、课程名称、任课教师姓名及平均分。
此任务涉及course、score、teacher和teach共四个表。通过对班级编号、课程名称、任课教师姓名的分组,获得每个班级不同课程的平均分,再利用HAVING子句筛选出平均分高于80分的课程相关信息。
课程信息统计
任务分析
4.4.1 嵌套查询概述
单层查询:查询中只有一个SELECT-FROM-WHERE查询块。
嵌套查询:一个查询块嵌套在SELECT、INSERT、UPDATE或DELETE语句中的WHERE或HAVING子句进行的查询。外层的SELECT 语句称为外查询(主查询),内层的select语句称为内查询(子查询)
嵌套查询的语法格式如下:
SELECT * FROM 表名 WHERE 表达式 关系运算符 [ANY|ALL|SOME] (子查询)
SELECT * FROM 表名 WHERE 表达式 [NOT] IN (子查询)
SELECT * FROM 表名 WHERE 表达式 [NOT] EXISTS (子查询)
子查询需要用圆括号括起来。
子查询的SELECT语句中不能使用image、text、ntext等数据类型。
子查询返回结果值的数据类型必须和新增列或WHERE子句中的数据类型匹配。
子查询中不能使用ORDER BY子句。ORDER BY子句应该放在最外层的父查询中,对最终的查询结果排序。
知识导读
4.4.2 使用关系运算符的嵌套查询
使用关系运算符的嵌套查询语法格式如下:
表达式 关系运算符 [ALL|ANY|SOME] (子查询)
当子查询返回的是单值时,子查询可以由一个关系运算符(=、<、<=、>、>=、!=或<>)引入。
当子查询可能返回多个值时,可以将关系运算符与逻辑运算符ANY、SOME和ALL结合起来使用。
ANY、SOME是存在量词,表示表达式只要与子查询的结果集中的某个值满足比较关系,就返回true,否则返回false。两者含义相同,可互换。
ALL也是存在量词,要求子查询的所有查询结果列都要满足搜索条件。
知识导读
4.4.2 使用关系运算符的嵌套查询
【例4-49】利用嵌套查询查询学号为1704091203的学生所
在班级的名称。
利用嵌套查询将例4-40写成如下T-SQL语句:
SELECT class_name
FROM class 父查询
WHERE