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
投稿

猜你喜欢

  • 简明 Python 基础学习教程

    2023-01-05 13:02:05
  • php7 参数、整形及字符串处理机制修改实例分析

    2023-11-23 19:48:31
  • Node.js基础模块babel使用详解

    2024-05-13 09:35:11
  • MYSQL ZIP免安装版配置步骤及图形化管理工具mysql-workbench

    2024-01-24 23:36:53
  • Oracle PL/SQL入门案例实践

    2010-07-18 13:13:00
  • Javascript 回调和事件(翻译)

    2009-03-28 11:47:00
  • onmousewheel event 缩放图片效果

    2023-07-02 04:55:50
  • Mysql效率优化定位较低sql的两种方式

    2024-01-22 20:52:13
  • linux下利用Docker安装mysql的步骤

    2024-01-25 01:17:56
  • 编写SQL需要注意的细节Checklist总结

    2024-01-17 14:41:56
  • 基于JSP的RSS阅读器的设计与实现方法(推荐)

    2024-05-03 15:31:26
  • js中的文档模式-document.compatMode

    2009-08-14 20:30:00
  • MySQL数据库重命名的快速且安全方法(3种)

    2024-01-27 23:33:54
  • SQL Server 2005恢复Master库

    2011-05-16 13:11:00
  • Pandas数据结构中Series属性详解

    2021-12-13 22:32:17
  • selenium3.0+python之环境搭建的方法步骤

    2023-03-20 06:00:22
  • JavaScript点击按钮后弹出透明浮动层的方法

    2023-08-05 22:33:29
  • python Task在协程调用实例讲解

    2021-06-28 21:39:32
  • JavaScript生成.xls文件的代码

    2024-04-22 22:17:34
  • MySQL多实例安装开机自启动服务配置过程

    2024-01-14 14:32:17
  • asp之家 网络编程 m.aspxhome.com