预览加载中,请您耐心等待几秒...
1/8
2/8
3/8
4/8
5/8
6/8
7/8
8/8

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

什么是嵌套查询 嵌套查询是指在一个外层查询中包含有另一个内层查询,即一个SQL查询语句块可以嵌套在另一个查询块的WHERE子句中。其中外层查询称为父查询、主查询。内层查询也称为子查询、从查询。 什么是子查询 子查询是SELECT语句内的另外一条SELECT语句,而且常常被称为内查询或是内SELECT语句。SELECT、INSERT、UPDATE或DELETE命令中允许是一个表达式的地方都可以包含子查询,子查询甚至可以包含在另外一个子查询中。 1.语法 子查询的句法如下: (SELECT[ALL|DISTINCT]<selectitemlist> FROM<tablelist> [WHERE<searchcondition>] [GROUPBY<groupitemlist> [HAVING<groupbysearchconditoon>]]) 2.语法规则 (1)子查询的SELECT查询总使用圆括号括起来。 (2)不能包括COMPUTE或FORBROWSE子句。 (3)如果同时指定TOP子句,则可能只包括ORDERBY子句。 (4)子查询最多可以嵌套32层,个别查询可能会不支持32层嵌套。 (5)任何可以使用表达式的地方都可以使用子查询,只要它返回的是单个值。 (6)如果某个表只出现在子查询中而不出现在外部查询中,那么该表中的列就无法包含在输出中。 3.语法格式 (1)WHERE查询表达式[NOT]IN(子查询)。 (2)WHERE查询表达式比较运算符[ANY|ALL](子查询)。 (3)WHERE[NOT]EXISTS(子查询)。 简单嵌套查询 嵌套查询内层子查询通常作为搜索条件的一部分呈现在WHERE或HAVING子句中。例如,把一个表达式的值和一个由子查询生成的一个值相比较,这个测试类似于简单比较测试。 子查询比较测试用到的运算符是:=、<>、<、>、<=、>=。子查询比较测试把一个表达式的值和由子查询的产生的一个值进行比较,返回比较结果为TRUE的记录。 下面在“student”表中,查询“课程成绩”>96分的同学信息。在查询分析器中输入的SQL语句如下: usestudent select* fromstudent where学号=(select学号fromgradewhere课程成绩>96) 实现的过程如图1所示。 图1成绩大于90分的同学信息 子查询“select学号fromgradewhere课程成绩>96”的查询结果是“B003”,即是一个值。 子查询过程如下: (1)从“grade”表中查询出“课程成绩”>96的学生学号为“B003”。 (2)从学生表中查询出“学号”是“B003”的学生信息。 带IN的嵌套查询 带IN的嵌套查询语法格式为:WHERE查询表达式IN(子查询)。 一些嵌套内层的子查询会产生一个值,也有一些子查询会返回一列值,即子查询不能返回带几行和几列数据的表。原因在于子查询的结果必须适合外层查询的语句。当子查询产生一系列值时,适合用带IN的嵌套查询。 把查询表达式单个数据和由子查询产生的一系列的数值相比较,如果数值匹配一系列值中的一个,则返回TRUE。 下面在“student”和“grade”表中,查询参加考试的同学信息。在查询分析器中输入的SQL语句如下: usestudent select* fromstudent where学号in(select学号fromgrade) 实现的过程如图1所示。 图1参加考试的同学信息 子查询“select学号fromgrade”的结果如图2所示。 图2子查询结果 子查询生成“grade”表中学号列的数值,WHERE子句检查主查询记录中的值是否与子查询结果中的数值匹配,匹配返回TRUE值。由于主查询记录的“B006”的学号值与子查询结果的数值不匹配,所以查询结果不显示学号为“B006”的记录信息。 带IN的内层嵌套还可以是多个值的列表。 例如,查询“年龄”是“22、21、24”的学生信息。SQL语句如下: usestudent select* fromstudent where年龄in(21,22,24) 带NOTIN的嵌套查询 NOTIN的嵌套查询语法格式:WHERE查询表达式NOTIN(子查询) NOTIN和IN的查询过程相类似。 在“course”和“grade”表中,查询没有考试的课程信息。SQL语句如下: usestudent select* fromcourse where课程代号notin (select课程代号fromgradewhere课程代号isnotnull) 实现的过程如图1所示。 图1没有考试的课程信息 查询过程是用主查询中“课程代号”的值与子查询结果中的值比较,不匹配返回真值。由于主查询中的“k05”和“k06”的课程代