资源简介 (共22张PPT)查询与维护学生信息管理数据表任务6-1 简单数据查询目录Contents任务6-2 多表连接查询任务6-3 嵌套查询任务6-4 集合查询任务6-5 学生信息浏览、查询、统计任务6-6 数据更新任务6-7 学生基本信息维护、信息导出任务6-3 嵌套查询PART 3(一)嵌套子查询(二)相关子查询任务assignments嵌套查询任务6-3任务1-1 数据处理【任务分析】查询数据时,一个SELECT…FROM…WHERE语句称为一个查询块。将一个查询块嵌套在另一个查询块的WHERE子句或HAVING子句的条件中称为嵌套查询或子查询。嵌套查询可以帮助解决多表联接查询问题及其他解决不了的查询问题。嵌套查询可以使一系列简单查询构成复杂的查询,从而明显增强SQL的查询能力。以层层嵌套的方式来构造程序正是SQL中“结构化”的含义所在。【课堂任务】掌握并理解表的嵌套查询。 嵌套子查询 相关子查询嵌套查询任务6-3任务1-1 数据处理例如,查询选修了002号课程的学生的姓名。SELECT snameFROM studentWHERE sno IN(SELECT snoFROM scWHERE cno='002')在这个例子中,下层查询块“SELECT sno FROM sc WHERE cno='002'”嵌套在上层查询块“SELECT sname FROM student WHERE sno IN”的WHERE条件中。上层的查询块又称为外部查询、外部选择、父查询或主查询,下层查询块又称为内层查询、内部选择或子查询。SQL允许多层嵌套查询,即一个子查询中还可以嵌套其他子查询。需要特别指出的是,子查询中的SELECT语句用一对括号“()”定界。子查询包括SELECT、FROM子句,可选WHERE、GROUP BY、HAVING子句,一般不能使用ORDER BY子句,除非指定了 TOP 子句,这时能包含ORDER BY子句。ORDER BY子句永远只能对最终查询结果排序。嵌套查询任务6-3任务1-1 数据处理如果某个表只出现在子查询中,而没有出现在外部查询中,那么该表中的列就无法包含在输出(外部查询的选择列表)中。嵌套查询的求解方法是由里向外处理的,即每个子查询在其上一级查询处理之前求解,子查询的结果用于建立其父查询的查找条件。子查询一般分为两种:嵌套子查询和相关子查询。嵌套查询任务6-3任务1-1 数据处理(一)嵌套子查询嵌套子查询又称为不相关子查询,也就是说,嵌套子查询的执行不依赖于外部嵌套。嵌套子查询的执行过程为:首先执行子查询,子查询得到的结果集不被显示出来,而是传给外部查询,作为外部查询的条件使用,然后执行外部查询,并显示查询结果。子查询可以多层嵌套。嵌套子查询一般也分为两种:子查询返回单个值和子查询返回一个值列表。嵌套查询任务6-3任务1-1 数据处理1.返回单个值当子查询返回单个值时,这个值可用于外部查询的比较操作(如,= 、!=、<、<=、>、>=),该值可以是子查询中使用聚集函数得到的值。【例6.50】 查询所有年龄大于平均年龄的学生的姓名(注:在student表中加入sage(年龄)字段)。SELECT snameFROM studentWHERE sage>(SELECT AVG(sage) FROM student )在例6.50中,SQL首先获得“SELECT AVG(sage) FROM student”的结果集,该结果集为单行单列,然后将其作为外部查询的条件执行外部查询,并得到最终的结果。嵌套查询任务6-3嵌套查询任务6-3任务1-1 数据处理2.返回一个值列表子查询结果是0个或多个值的列表,不确定只有一个值时,外部查询可使用IN、NOT IN、ANY或ALL等操作符。(1)使用IN或NOT IN操作符的嵌套查询。IN表示属于,用于判断外部查询中某个属性列值是否在子查询的结果中。由于在嵌套查询中,子查询的结果往往是一个集合,所以IN操作符是嵌套查询中最常用的操作符。嵌套查询任务6-3任务1-1 数据处理嵌套查询任务6-3任务1-1 数据处理(2)带有ANY或ALL操作符的子查询。ANY(SOME是与ANY等效的ISO标准。)和ALL操作符必须和比较运算符一起使用,其格式如下。<字段><比较符>[ANY|ALL]<子查询>ANY和ALL的用法及含义见表6.3。嵌套查询任务6-3任务1-1 数据处理嵌套查询任务6-3任务1-1 数据处理嵌套查询任务6-3任务1-1 数据处理嵌套查询任务6-3任务1-1 数据处理(二)相关子查询在相关子查询(Correlated Subquery)中,子查询的执行依赖于外部查询,即子查询的查询条件依赖于外部查询的某个属性值。相关子查询的执行过程与嵌套子查询完全不同,嵌套子查询中的子查询只执行一次,而相关子查询中的子查询需要重复执行。相关子查询的执行过程如下。(1)子查询将外部查询的每一个元组(行)执行一次,外部查询将子查询引用列的值传给子查询。(2)如果子查询的返回值与外部查询某行元组中的值相匹配,则外部查询取此行放入结果表。(3)返回(1),直到处理完外部表的每一行。嵌套查询任务6-3任务1-1 数据处理嵌套查询任务6-3任务1-1 数据处理嵌套查询任务6-3任务1-1 数据处理嵌套查询任务6-3任务1-1 数据处理3.子查询规则因为子查询也是使用SELECT语句实现的,所以使用SELECT语句应注意的问题,也同样适用于子查询,同时,子查询还受下面条件的限制。(1)通过比较运算符引入的子查询的选择列表只能包括一个表达式或列名称。(2)如果外部查询的WHERE子句包括某个列名,则该子句必须与子查询选择列表中的该列兼容。(3)子查询的选择列表中不允许出现ntext、text和image数据类型。(4)无修改的比较运算符引入的子查询不能包括GROUP BY和HAVING子句。(5)包括GROUP BY的子查询不能使用DISTINCT关键字。(6)不能指定COMPUTE和INTO子句。嵌套查询任务6-3任务1-1 数据处理(7)了查询中只有在select子句中使用了TOP关键字,才可以在子查询中使用ORDER BY子句。(8)由子查询创建的视图不能更新。(9)通过EXISTS引入的子查询的选择列表由星号(*)组成,而不使用单个列名。(10)当=、!=、<、<=、>或>=用在主查询中时,ORDER BY子句和GROUP BY子句不能用在内层查询中,因为内层查询返回的一个以上的值不能被外层查询处理。子查询是一个嵌套在SELECT、INSERT、UPDATE和DELETE语句或其他子查询中的查询。任何允许使用表达式的地方都可以使用子查询。尽管可用内存和查询中其他表达式的复杂程度不同,嵌套限制也有所不同,但嵌套可以到32层。 展开更多...... 收起↑ 资源预览