SQL子查询全接触

作者:dnawo 时间:2007-08-20 10:51:00 

一、什么是sql子查询?
 
子查询是一个嵌套在Select 、Insert 、Update 或Delete语句或其他子查询中的查询。任何允许使用表达式的地方都可以使用子查询。子查询也称为内部查询或内部选择,而包含子查询的语句也称为外部查询或外部选择。
在以下示例中,子查询在Select语句中被用作名为 MaxUnitPrice 的列表达式。
 


Select or d.SalesOr   derID, or d.Or derDate, 
    (Select MAX(Or dDet.UnitPrice) 
     FROM AdventureWor  ks.Sales.SalesOr derDetail AS or dDet 
     Where or d.SalesOr derID = or dDet.SalesOr derID) AS MaxUnitPrice 
FROM AdventureWor ks.Sales.SalesOr derHeader AS ord



许多包含子查询的 Transact-SQL 语句都可以改用联接表示。其他问题只能通过子查询提出。在 Transact-SQL 中,包含子查询的语句和语义上等效的不包含子查询的语句在性能上通常没有差别。但是,在一些必须检查存在性的情况中,使用联接会产生更好的性能。否则,为确保消除重复值,必须为外部查询的每个结果都处理嵌套查询。所以在这些情况下,联接方式会产生更好的效果。以下示例显示了返回相同结果集的Select子查询和Select联接:
 


/* Select statement built using a subquery. */ 
Select Name 
FROM AdventureWor ks.Production.Product 
Where ListPrice = 
    (Select ListPrice 
     FROM AdventureWor ks.Production.Product 
     Where Name = ’Chainring Bolts’ ) 
  
/* Select statement built using a join that returns 
   the same result set. */ 
Select Prd1. Name 
FROM AdventureWor ks.Production.Product AS Prd1 
     JOIN AdventureWor ks.Production.Product AS Prd2 
       ON (Prd1.ListPrice = Prd2.ListPrice) 
Where Prd2. Name = ’Chainring Bolts’


嵌套在外部Select语句中的子查询包括以下组件:
 
●包含常规选择列表组件的常规Select查询。
●包含一个或多个表或视图名称的常规 FROM 子句。
●可选的 Where 子句。
●可选的 GROUP BY 子句。
●可选的 HAVING 子句。
 
子查询的Select查询总是使用圆括号括起来。它不能包含COMPUTE 或 FOR BROWSE 子句,如果同时指定了 TOP 子句,则只能包含 or DER BY 子句。
 
子查询可以嵌套在外部 Select,Insert,Update 或 Delete语句的 Where 或 HAVING 子句内,也可以嵌套在其他子查询内。尽管根据可用内存和查询中其他表达式的复杂程度的不同,嵌套限制也有所不同,但嵌套到 32 层是可能的。个别查询可能不支持 32 层嵌套。任何可以使用表达式的地方都可以使用子查询,只要它返回的是单个值。
 
如果某个表只出现在子查询中,而没有出现在外部查询中,那么该表中的列就无法包含在输出(外部查询的选择列表)中。
 
包含子查询的语句通常采用以下格式中的一种: 
 

●Where expression [NOT] IN (subquery)
●Where expression comparison_operator [ANY | ALL] (subquery)
●Where [NOT] EXISTS (subquery)
在某些 Transact-SQL 语句中,子查询可以作为独立查询来计算。从概念上说,子查询结果会代入外部查询(尽管这不一定是 Microsoft SQL Server 2005 实际处理带有子查询的 Transact-SQL 语句的方式)。
 
有三种基本的子查询。它们是:
 
●在通过 IN 或由 ANY 或 ALL 修改的比较运算符引入的列表上操作。
●通过未修改的比较运算符引入且必须返回单个值。
●通过 EXISTS 引入的存在测试。

标签:sql,查询,子查询
0
投稿

猜你喜欢

  • google 的设计原则和LOGO手绘

    2008-05-20 12:16:00
  • 如何实现文本的卷屏浏览?

    2010-05-24 18:36:00
  • ASP获取远程文件大小信息(通过header头信息)

    2010-03-11 21:25:00
  • 优化代码 改善CSS文件可读性

    2008-06-13 13:50:00
  • OracleEXP和IMP用法和介绍

    2010-07-28 13:18:00
  • asp函数收藏

    2009-04-21 13:10:00
  • ASP处理多关键词查询实例代码

    2008-11-21 17:36:00
  • Mootools 1.2教程(5)——事件处理

    2008-11-19 16:33:00
  • ExpiresAbsolute 属性

    2008-05-05 12:49:00
  • 斜角滑动门导航条 DIV+CSS

    2008-07-19 15:45:00
  • 如何从ASP连接到Oracle Server?

    2009-11-15 19:52:00
  • [翻译]JavaScript中对象的层次与继承

    2008-12-31 13:36:00
  • 利用ASP+JMAIL进行邮件群发的新思路

    2008-03-20 13:30:00
  • 如何将服务器端变量转换为客户端的变量?

    2009-12-03 19:54:00
  • 怎么写好一份图形界面设计师简历

    2009-04-16 13:10:00
  • DHTML+XML+ASP+CSS的树形目录

    2008-10-24 14:29:00
  • 分享10个Js的小型库,效果真的很棒

    2009-08-27 15:38:00
  • asp如何显示最后十名来访者信息?

    2010-06-09 18:45:00
  • 做新产品?悠着点

    2009-03-01 13:10:00
  • 8大措施帮你构筑Access安全防线

    2010-03-11 14:38:00
  • asp之家 网络编程 m.aspxhome.com