SQLServer子查询以分为相关子查询和嵌套子查询
类别编号 图书名 出版社 价格
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
相关子查询的执行依赖于外部查询,多情况下是子查询的WHERE子句中引用外部查询的表
--例2
1)从外层查询中取出一个元组,将元组相关的列值传给内层查询。
2)执行内层查询,得到子查询的值。
select 书名,作者,出版社,价格
FROM BOOK As a
where 价格 >
(
select avg(价格)
from Books as b
where a.类编号=b.类编号
)
go
--可以看出,相关查询无法独立于外部查询,该查询需要一个编号的值而这个值是个变量,随SQLSever检索Books表中的不同行而改变。
先将Books表中的第一条记录的”编号“的值“2”带入子查询中子查询变为:
select avg(价格)
from Books as b
where b.类编号=2
子查询的结果为该类图书的平均价格,所以外部查询变为:
select 书名,作者,出版社,价格
from Books as b
where 价格 >34
如果where条件为True,则第一条结果包括在结果集中,否则不包括。
总结:
1)相关子查询的执行依赖于外部查询的数据,外部查询执行一行,子查询就执行一次。
2)非相关子查询是独立于外部查询的子查询,子查询总共执行一次执行完毕后将值传递给外不查询。