SQLServer子查询可以分为相关子查询和嵌套子查询两类。前提,假设Books表如下:
类编号图书名 出版社价格
--------------------------------------------------------
2 c#高级应用 圣通出版 23.00
2 Jsp开发应用机械出版社 45.00
3 高等数学 济南出版社 25.00
3 疯狂英语 清华大学出版社 32.00
嵌套子查询的执行不依赖与外部的查询。执行过程:
(1)执行子查询,其结果不被显示,而是传递给外部查询,作为外部查询的条件使用。
(2)执行外部查询,并显示整个结果。
嵌套子查询一般可以分为:返回 单值的子查询 和 返回一个列表的子查询 ,下面举例说明:
1.返回单值:
--查询所有价格高于平均价格的图书名,作者,出版社和价格。
USE tempdb
GO
SElECT 图书名,作者,出版社,价格
FROM Books
WHERE 价格 >
(
SELECT AVG(价格)
FROM Books
)
GO
2.返回值列表
--查询所有借阅图书的读者信息
SElECT *
FROM Readers
WHERE 读者编号 IN
(
SELECT 读者编号
FROM [Borrow History]
)
GO
相关子查询的执行依赖于外部查询。多数情况下是子查询的WHERE子句中引用了外部查询的表。执行过程:
(1)从外层查询中取出一个元组,将元组相关列的值传给内层查询。
(2)执行内层查询,得到子查询操作的值。
(3)外查询根据子查询返回的结果或结果集得到满足条件的行。
(4)然后外层查询取出下一个元组重复做步骤1-3,直到外层的元组全部处理完毕。
下面举例说明:
--查询Booka表中大于该类图书价格平均值的图书信息
SElECT 图书名,出版社,类编号,价格
FROM Books As a
WHERE 价格 >
(
SELECT AVG(价格)
FROM Books AS b
WHERE a.类编号=b.类编号
)
GO
与前面介绍过的子查询不同,相关子查询无法独立于外部查询而得到解决。该子查询需要一个“类编号”的值。而这个值是个变量,随SQLSever检索Books表中的不同行而改变。下面详细说明该查询执行过程:
先将Books表中的第一条记录的“类编号”的值“2”代入子查询中,子查询变为:
SELECT AVG(价格)
FROM Books AS b
WHEREb.类编号=2
子查询的结果为该类图书的平均价格,所以外部查询变为:
SElECT 图书名,出版社,类编号,价格
FROM Books As a
WHERE 价格> 34
如果WHERE条件为True,则第一条结果包括在结果集中,则否不包括。同样对类编号2进行对Books表中的所有行运行相同的过程,最后形成的结果集及最后返回结果。
类编号图书名
出版社价格
--------------------------------------------------------
2 c#高级应用 圣通出版 23.00
2 Jsp开发应用机械出版社 45.00
3 高等数学 济南出版社 25.00
3 疯狂英语 清华大学出版社 32.00
此时第一条条目的价格为23(不符合价格>34)。所以,这一条不会包括在结果集中。
接着,将Books的第二条记录代入子查询中,此时,价格45>34。因此就会将第二条加入结果集中。
第三条,25<28.5,不包含。
第四条,32>28.5,包含。
所以,结果会包含2条记录:
2 Jsp开发应用机械出版社 45.00
3
疯狂英语 清华大学出版社 32.00
本文在原文基础上略有修改。
转自:http://www.cnblogs.com/Ryan_j/archive/2010/10/20/1857026.html
相关推荐
很多SQL Server程序员对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。
有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中将重点讨论嵌套子查询。
很多SQL Server程序员对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。 有两种子查询类型:标准和相关。标准子查询执行一次,...
《精通SQ:结构化查询语言详解》全面讲解SQL语言,提供317个典型应用,读者可以随查随用,针对SQL Server和Oracle进行讲解,很有代表性。 全书共包括大小实例317个,突出了速学速查的特色。《精通SQ:结构化查询语言...
3.3 相关子查询 3.4 派生表 3.5 EXISTS运算符 3.6 INTERSECT和EXCEPT运算符 3.7 通用表表达式(CTE) 3.8 递归查询 3.9 合并 3.10 利用外部调用完成复杂操作 3.11 性能考虑 3.12 小结 ...
3.3 相关子查询 3.4 派生表 3.5 EXISTS运算符 3.6 INTERSECT和EXCEPT运算符 3.7 通用表表达式(CTE) 3.8 递归查询 3.9 合并 3.10 利用外部调用完成复杂操作 3.11 性能考虑 3.12 小结 ...
10.2.2 in子查询实现集合交和集合差运算 191 10.2.3 exists子查询 192 10.2.4 exists子查询实现两表交集 194 10.2.5 some/all子查询 195 10.2.6 unique子查询 197 10.3 相关子查询 198 10.3.1 使用in引入相关...
10.5 UNIQUE子查询与嵌套子查询 10.5.1 UNIQUE子查询 10.5.2 嵌套子查询 10.6 小结第4篇 T-SQL开发常用操作篇第11章 数据的维护操作 11.1 数据的插入操作 11.1.1 INSERT语句的基本语法 11.1.2 插入单条记录 11.1.3 ...
您可能感兴趣的文章:使用SQL Server数据库嵌套子查询的方法常用SQL语句(嵌套子查询/随机等等)详细整理SQL Server高级内容之子查询和表链接概述及使用详细讲述MySQL中的子查询操作浅谈MySQL中的子查询优
Ø 嵌套子查询 子查询是一个嵌套在select、insert、update或delete语句或其他子查询中的查询。任何允许使用表达式的地方都可以使用子查询。子查询也称为内部查询或内部选择,而包含子查询的语句也成为外部查询或...
3.3 相关子查询 3.4 派生表 3.5 EXISTS运算符 3.6 INTERSECT和EXCEPT运算符 3.7 通用表表达式(CTE) 3.8 递归查询 3.9 合并 3.10 利用外部调用完成复杂操作 3.11 性能考虑 3.12 小结 ...
3.3 相关子查询 3.4 派生表 3.5 EXISTS运算符 3.6 INTERSECT和EXCEPT运算符 3.7 通用表表达式(CTE) 3.8 递归查询 3.9 合并 3.10 利用外部调用完成复杂操作 3.11 性能考虑 3.12 小结 ...
3.3 相关子查询 3.4 派生表 3.5 EXISTS运算符 3.6 INTERSECT和EXCEPT运算符 3.7 通用表表达式(CTE) 3.8 递归查询 3.9 合并 3.10 利用外部调用完成复杂操作 3.11 性能考虑 3.12 小结 ...
3.3 相关子查询 3.4 派生表 3.5 EXISTS运算符 3.6 INTERSECT和EXCEPT运算符 3.7 通用表表达式(CTE) 3.8 递归查询 3.9 合并 3.10 利用外部调用完成复杂操作 3.11 性能考虑 3.12 小结 ...