SQL Server 嵌套查询
南京信息职业技术学院 信息服务学院
摘 要:嵌套查询就是用一个 Select 查询的结果作为查询的条件。嵌套查询可以将一系列简单查询构成复杂查询,增强查询能力。 子查询的嵌套层次最多可达到 255 层,以层层嵌套的方式构造查询充分体现了 SQL“结构化”的特点。 嵌套查询的结果可以是单行或者多行。返回单行的非相关子查询通常用在比较运算符之后;返回多行的非相关子查询通常用在比较运算符与 ANY、ALL 组成的运算符、IN 和 NOT IN 之后。
关键词:嵌套查询;数据查询;查询
引言
非相关子查询,也称嵌套查询,可以多层嵌套。嵌套查询可以将一系列简单查询构成复杂查询,增强查询能力。 子查询的嵌套层次最多可达到 255 层,以层层嵌套的方式构造查询充分体现了 SQL“结构化”的特点。 嵌套查询在运行时由里向外处理,每个子查询先于上一级外查询执行,子查询的结果作为外查询的条件值,然后执行外查询。
非相关子查询的结果可以是单行或者多行。返回单行的非相关子查询通常用在比较运算符之后;返回多行的非相关子查询通常用在比较运算符与 ANY、ALL 组成的运算符、IN和 NOT IN 之后。
一、单行子查询
当子查询的返回值只有一个时,可以把子查询看成一个常量,因此可以使用比较运算符将外查询和子查询连接起来。
(1)比较子查询
例1 查询与王明同一个部门的所有读者的读者编号和读者名。
SELECT ReaderID, ReaderName FROM ReaderDetailWHERE ReaderDep= (SELECT ReaderDep
FROM ReaderDetail WHERE ReaderName=’王明’)说明:
1)上述语句的执行过程是先执行子查询:
SELECT ReaderDep FROM ReaderDetail WHERE
ReaderName==’王明’
子查询的查询结果为:计算机系(王明所在部门)。将计算机系作为外查询的查询条件,此时的外查询为:
SELECT ReaderID, ReaderName FROM ReaderDetailWHERE ReaderDep=’计算机系’
2)使用比较运算符将外查询和子查询连接起来,必须保证子查询的返回值只有一个,否则会发生错误。
(2)统计函数和子查询
只要不使用 GROUP BY 子句,在 SELECT 子句中使用统计函数的子查询的返回结果肯定是一行。因此,可以使用比较运算符将外查询和这类子查询连接起来。
二、多行子查询
在多行子查询中,必须使用多行运算符来判断条件,而不能是用单行运算符。多行运算符可以执行与一个或多个数据的比较操作。
(1)IN 的使用
用 IN 连接外查询和子查询,子查询的返回结果可以包含零个或多个值,子查询的结果作为外查询的条件值,然后执行外查询。
(2)NOT IN 的使用
NOT IN 的使用和 IN 的使用基本一样。
(3)ANY 和 ALL 的使用
如果子查询返回多个值,即一个集合,可以在比较运算符之后加 ANY 或 ALL 关键字。使用格式为:
〈列名〉〈比较运算符〉[ANY|ALL]〈子查询〉说明:
1)ANY 的含义为:将一个列值与子查询返回结果集中的的每一个值进行比较。若在某次比较的结果为真,则整个子查询结果集的比较为真;只有每一次比较的结果为假,则整个子查询结果集的比较为假。
2)ALL 的含义为:将一个列值与子查询返回结果集中的的每一个值比较。若每一次比较的结果均为真,则整个子查询结果集的比较为真;只要有一次比较的结果为假,则整个子查询结果集的比较为假。
ANY 和 ALL 的使用与比较运算符组合使用的语义为:
● >ANY 大于子查询结果中的某个值
● > ALL 大于子查询结果中的所有值
● < ANY 小于子查询结果中的某个值
● < ALL 小于子查询结果中的所有值
● >= ANY 大于等于子查询结果中的某个值
● >= ALL 大于等于子查询结果中的所有值
● <= ANY 小于等于子查询结果中的某个值
● <= ALL 小于等于子查询结果中的所有值
● = ANY 等于子查询结果中的某个值
● = ALL 等于子查询结果中的所有值(没有实际意义)● != ANY 或 <> ANY 不等于子查询结果中的某个值● != ALL 或 <> ALL 不等于子查询结果中的任何一个值IN 和 = ANY 等价,!= ALL 或 <> ALL 和 NOT IN 等价。
例2 查询其他出版社中比“机械工业出版社”任意一本书价格高的图书名、出版社和单价。
方法一:
SELECT BookName,PublishingCompany,Price FROMBookDetail
WHERE PublishingCompany!= ' 机械工业出版社 '
AND Price>ANY (SELECT Price FROM BookDetail WHEREPublishingCompany= ' 机械工业出版社 ')
方法二:
SELECT BookName,PublishingCompany,Price FROMBookDetail
WHERE PublishingCompany!= ' 机械工业出版社 '
AND Price>(SELECT MIN(Price) FROM BookDetailWHERE PublishingCompany= ' 机械工业出版社 ')>ANY 表示大于子查询结果中的最小值,所以可以在子查询的 SELECT 子句中使用 MIN 函数代替 ANY。
三、结论
嵌套查询,可以实现多层嵌套。嵌套查询可以将一系列简单查询构成复杂查询,增强查询能力。子查询的嵌套层次最多可达到 255 层,以层层嵌套的方式构造查询充分体现了SQL“结构化”的特点。 嵌套查询在运行时由里向外处理,每个子查询先于上一级外查询执行,子查询的结果作为外查询的条件值,然后执行外查询。
参考文献:
[1] 陈洛资,陈昭平. 数据库系统及应用基础(第2版). 北京:
清华大学出版社 , 北京交通大学出版社,2005.
[2] 李代平 . SQL server 2000 实用宝典.北京:地质出版社,2001.
[3] 徐人风.SQL Server 2000 数据库及应用.北京:高等教育出版社,2004.
[4] 李调阳.SQL Server 2000 中文版标准教程.北京:海洋出版社,2005.