嵌套查询是指一个查询语句嵌套在另一个查询语句内部的查询。嵌套查询也就子查询,在SELECT子句中先计算子查询,子查询结果作为外层另一个查询的过滤条件,查询可以基于一个表或多个表。子查询中可以使用比较运算符,如“<”、“<=”、“>”、“>=”等。

  子查询中常用的操作符有ANY(SOME)、ALL、EXISTS。子查询可以添加到SELECT 、UPDATE和DELETE语句中,可以进行多层嵌套。

1 使用比较运算符

  子查询使用比较运算符,如“<”、“<=”、“>”、“>=”等。

  示例:返回单个值的SELECT语句的嵌套查询

SELECT * FROM [dbo].[Product]
WHERE [UnitPrice] = (
SELECT MIN([UnitPrice]) FROM [dbo].[Product]
)
SELECT * FROM [dbo].[Product]
WHERE [CategoryID] =
( SELECT [CategoryID] FROM [dbo].[Category] WHERE [CategoryName] = 'LINQ to SQL' )

2. 使用IN关键字

  IN关键字进行子查询时,内层查询语句仅仅返回一个数据列,这个数据列里的值将提供给外层查询语句进行比较。

  示例:返回多个值的子查询的嵌套查询

SELECT * FROM [dbo].[Product]
WHERE [CategoryID] IN (
SELECT [CategoryID] FROM [dbo].[Category] WHERE [CategoryID] <= 10
)

  尽管使用IN的嵌套查询方式可以实现,但更好的方式是使用内连接实现这种查询,而不是使用使用嵌套的SELECT。

  上例的子查询使用INNER JOIN方式:

SELECT [dbo].[Product].* FROM [dbo].[Product]
INNER JOIN [dbo].[Category]
ON [dbo].[Product].[CategoryID] = [dbo].[Category].[CategoryID]
WHERE [dbo].[Category].[CategoryID] <= 10

  出于性能方面的考虑,如果没有特别的理由要使用嵌套的SELECT,则还是应使用连接方式作为默认的解决方案。在大部分情况下,SQL Server会将嵌套子查询解决方案解析为和使用连接用于的查询计划,在检查嵌套子查询和内连接查询计划时,会发现它们的完全相同的计划。大多数情况下,这两种方法没有多大的区别。当查询计划不同时,连接通常的更好的选择。

  SELECT语句中可以使用NOT IN运算符,其作用与IN相反。

3. ANY、SOME关键字

  ANY和SOME关键字是同义词,表示满足其中任一条街。它们允许创建一个表达式对子查询的返回值列表进行比较,只要满足内层子查询中任何一个比较条件,就返回一个结果作为外层查询的条件。

  ANY关键字接在一个比较操作符的后面,表示与子查询返回的任何值比较为TRUE,则返回TRUE。

  示例:

IF 20 > ANY ( SELECT [UnitsInStock] FROM [dbo].[Product] )
PRINT ''
ELSE
PRINT ''

4. ALL关键字

  ALL关键字用于需要同时满足所有内层查询的条件,只有当子查询返回的所有值比较都为TRUE,才返回TRUE。

  示例:

IF 20 > ALL ( SELECT [UnitsInStock] FROM [dbo].[Product] )
PRINT ''
ELSE
PRINT ''

5. EXISTS关键字

  EXISTS关键字后面的参数是一个任意的子查询,系统对子查询进行运算以判断它是否返回行,如果至少返回一行,则EXISTS的结果为TRUE,此时外层查询语句将进行查询;如果子查询没有返回任何行,那么EXISTS返回的结果是FALSE,此时外层语句将不进行查询。

  示例:

SELECT * FROM [dbo].[Category]
WHERE EXISTS (
SELECT * FROM [dbo].[Product]
WHERE [CategoryID] = 1
)

  EXISTS关键字还可以和条件表达式一起使用。

SELECT * FROM [dbo].[Category]
WHERE [CategoryName] ='LINQ to SQL'
AND EXISTS (
SELECT * FROM [dbo].[Product]
WHERE [CategoryID] = 1
)

  NOT EXISTS与EXISTS使用方法相同,返回的结果相反。

SELECT * FROM [dbo].[Category]
WHERE NOT EXISTS (
SELECT * FROM [dbo].[Product]
WHERE [CategoryID] = 1
)

  Exists关联子查询:查询所有存在Product的Category

SELECT * FROM [dbo].[Category] c
WHERE EXISTS (
SELECT * FROM [dbo].[Product] p
WHERE p.[CategoryID] = c.[CategoryID]
)

  上例同样可以使用INNER JOIN实现:

SELECT c.* FROM [dbo].[Category] c
INNER JOIN [dbo].[Product] p
ON p.[CategoryID] = c.[CategoryID]

  基于连接的语法可以得到相同的结果,但使用EXISTS具有更好的性能。使用EXISTS关键字,SQL Server不需要执行一行一行的完全连接,而是直接寻找记录,直到找到第一个匹配的记录。

Sql Server系列:嵌套查询的更多相关文章

  1. Sql Server系列:查询分页语句

    1 利用临时表分页 分页存储过程: CREATE PROCEDURE [USP_Product_GetPaged] ), ), @PageIndex INT, @PageSize INT AS BEG ...

  2. 【转】SQL Server T-SQL高级查询

    SQL Server T-SQL高级查询 高级查询在数据库中用得是最频繁的,也是应用最广泛的. Ø 基本常用查询 --select select * from student; //查询student ...

  3. SQL Server的嵌套存储过程中使用同名的临时表怪像浅析

      SQL Server的嵌套存储过程,外层存储过程和内层存储过程(被嵌套调用的存储过程)中可以存在相同名称的本地临时表吗?如果可以的话,那么有没有什么问题或限制呢? 在嵌套存储过程中,调用的是外层存 ...

  4. SQL Server 系列文章快速导航(SWF版)

    一.前言 在博客园写博客不自不觉已经有5个年头了,一开始只是为了记录工作中遇到的问题和解决办法,后来写的文章不自不觉的侧重在SQL Server方面的技术文章,在2014年1月终于鼓起勇气申请了微软S ...

  5. SQL SERVER中XML查询:FOR XML指定PATH

    SQL SERVER中XML查询:FOR XML指定PATH 前言 在SQL SERVER中,XML查询能够指定RAW,AUTO,EXPLICIT,PATH.本文用一些实例介绍SQL SERVER中指 ...

  6. Sql Server 存储过程中查询数据无法使用 Union(All)

    原文:Sql Server 存储过程中查询数据无法使用 Union(All) 微软Sql Server数据库中,书写存储过程时,关于查询数据,无法使用Union(All)关联多个查询. 1.先看一段正 ...

  7. SQL Server数据库————连接查询和分组查询

    SQL Server数据库————连接查询和分组查询 分组查询 select 列from  <表名> where  …… group by  列 注意:跟order  by一样group ...

  8. (4.21)sql server中复制查询结果集

    在查询结果窗口中复制列标题似乎是一项简单的任务,但对于业余爱好者来说,这可能是一场噩梦. 没有可见的指令/链接/按钮,其中一个可以使用列标题单击和复制所选数据.让我们看看如何在SQL Server M ...

  9. SQL Server系列文章目录

    SQL Server系列文章目录SQL Server系列文章目录SQL Server系列文章目录SQL Server系列文章目录

  10. SQL Server跨服务器查询的实现方法,OpenDataSource

    SQL Server跨服务器查询的方法我们经常需要用到,下面就为您介绍两种SQL Server跨服务器查询的方法,如果您感兴趣的话,不妨一看. SQL Server跨服务器查询方法一:用OPENDAT ...

随机推荐

  1. Python for Infomatics 第14章 数据库和SQL应用一(译)

    14.1 什么是数据库 数据库一种存储结构数据的文件.绝大多数数据库类似字典——映射键和值的关系.最大的区别是数据库是保存在硬盘或其它永久性的存储上,所以在程序结束后它仍然存在.而保存在内存中的字典容 ...

  2. 如何让eclipse进行智能提示?

    1.打开eclipse工具,点击window菜单,选择preferences选项 2.然后,选择Java->Editor->content assist 3.然后在Auto activat ...

  3. 怎么取得dropdownlist选中的ID值

    把数据库绑定在dropdownlist中,然后把选中的dropdownlist的项的ID值保存在另外的一个数据库中.怎么取得dropdownlist选中的ID值呢?? this.DropDownLis ...

  4. IntelliJ IDEA全键盘操作

    IntelliJ IDEA 如何做到全键盘操作呢? 1.自定义快捷键实现全屏操作 你可以设置自定义快捷键进入全屏操作,并实现各个窗口之间的切换.这样,你就可以告别小窗口的时代,体验全屏显示的效果了!( ...

  5. PHP date函数时间相差8个小时解决办法

    php中date时间相差8个小时的解决办法 作者: PHP中文网|标签:|2016-7-25 08:46 在Windows上,在默认的PHP配置下,date函数返回的时间值和当地时间总是相差8小时,即 ...

  6. git学习笔记一

    一.概念理解 1.理解工作区和暂存区以及版本库 工作区我理解就是我们创建的程序所在的文件夹,比如test文件夹.其中有个.git文件,这个就是版本库,其中版本库中有个区域叫暂存区或叫索引. 截自廖雪峰 ...

  7. oracle10g冷备份和恢复过程记录

    一.冷备份: 1.操作系统无法进入,需要利用启动盘进入winpe系统进行操作. 2.进入PE系统后,搜索所有盘符确认没有其它被作为oracle数据文件存放的目录,也就是说所有oracle有关的文件都存 ...

  8. 为什么要重写hashcode() 方法

    Java中的集合(Collection)有两类,一类是List,再有一类是Set. 前者集合内的元素是有序的,元素可以重复:后者元素无序,但元素不可重复. 那么我们怎么判断两个元素是否重复呢? 这就是 ...

  9. CYQ.Data V5 从入门到放弃ORM系列:框架的优势

    前言: 框架开源后,学习使用的人越来越多了,所以我也更加积极的用代码回应了. 在框架完成了:数据库读写分离功能 和 分布式缓存功能 后: 经过三天三夜的不眠不休,终于完成框架第三个重量级的功能:自动化 ...

  10. ABP理论学习之功能管理

    返回总目录 本篇目录 介绍 功能类型 定义功能 检查功能 功能管理者 版本说明 介绍 大多数的Saas(多租户)应用都有不同 功能的 版本(包).因此,他们可以给租户(客户)提供不同的 价格和功能选项 ...