IT猫扑网:您身边最放心的安全下载站! 最新更新| 软件分类| 专题汇总| 手机版

您当前所在位置:IT猫扑网 > 数据库 > MSSQL > 如何巧妙利用SQL Server的EXISTS结构

如何巧妙利用SQL Server的EXISTS结构

时间:2015-06-28 00:00 来源:IT猫扑网|http://www.itmop.com/ 作者:网管联盟 我要评论(0)

有件东西我观察了很多年,那就是很少有开发者会去使用sql server中的一个非常有用的东西——EXISTS结构。你可以在各种情况中用到EXISTS结构,在这篇文章中我会向大家介绍其中的一些。

EXISTS结构

EXISTS结构是一个TSQL函数,这个函数会就圆括号中的子查询返回一个布尔变量。如果子查询返回了任意行的话,这个结构就返回真;否则,它就返回假。这个结构特别适用于查询表中是否存在某些记录。它也非常适合来决定是否在表中运行更新或者插入语句(在这篇文章中,随后我将向大家介绍)。

Listing A中创建了一个表并插入了一些数据,这样你就可以利用这张表来看看EXISTS结构是如何工作的了。Listing B中的脚本使用EXISTS结构在SalesHistory表中检查每一行,并根据已存在的行得到一个变量。这个脚本将返回1(真),这意味着SalesHistory表包含你所要查询的行。

在这种情况下,一旦在SalesHistory表中找到了一条记录,EXISTS结构就不会继续查找,并马上返回1。使用EXISTS结构额外的好处就是,一旦它找到满足条件的记录,就会立即返回。

Listing C与上面的脚本类似,但是它的返回值是0,因为在这个条件下,EXISTS条件不满足。

由于EXISTS结构的工作原理,所以下面的语句所实现的功能是一样的。


SELECT * FROM SalesHistory

WHERE EXISTS(SELECT NULL)

SELECT * FROM SalesHistory

WHERE 1 = 1

SELECT * FROM SalesHistory

WHERE EXISTS(SELECT 1)

在刚才的脚本中,你可能会对下面的语句感到迷惑:

SELECT * FROM SalesHistory

WHERE EXISTS(SELECT NULL)
 

因为NULL在数据库中是一个值(它是一个未知的值),在出现NULL值的地方EXISTS结构都将返回真。

开发者很少使用EXISTS对子查询进行操作。下面的查询将返回同样的结果集,虽然它们的结构不同。第一个查询使用了EXISTS的相关子查询,第二查询在SalesHistory表中,将SalePrice字段与该字段的总平均值进行比较。


SELECT * FROM SalesHistory sh

WHERE EXISTS

(
      SELECT avg(SalePrice)

      FROM SalesHistory shi

      HAVING AVG(SalePrice) > sh.SalePrice
)
SELECT * FROM SalesHistory sh

WHERE SalePrice <

(
      SELECT AVG(SalePrice)

      FROM SalesHistory shi
)

你可以使用EXISTS操作来决定,是否对某一个单独的记录使用UPDATE或者INSERT语句,就像下面的例子一样:


IF EXISTS

(

      SELECT * FROM SalesHistory

      WHERE SaleDate = '1/1/2001' AND

      Product = 'Computer' AND

      SalePrice = 1000

)

      UPDATE TOP(1) SalesHistory

      SET SalePrice = 1100

      WHERE SaleDate = '1/1/2001' AND

      Product = 'Computer' AND

      SalePrice = 1000
ELSE
      INSERT INTO SalesHistory

      (Product, SaleDate, SalePrice)

      VALUES

      ('Computer', '1/1/2001', 1100)
 

虽然在实际的环境中,你可能不会用到这里所介绍的例子,但是它们给你演示了如何利用EXISTS结构来决定使用哪种DML类型。


给它一个机会

下次,当你写查询语句的时候,请记住要使用EXISTS结构。它很容易掌握,使用也很方便,并且能在程序中给你提供很多便利。

关键词标签:SQL Server,EXISTS结构

相关阅读 sql server系统表损坏的解决方法 SQL Server asp.net 数据提供程序连接池 SqlServer2005对现有数据进行分区具体步骤 一个Access数据库数据传递的实例方法 为导入文件加上时间戳标记的两种方法 SQL Server 2005 在不允许远程连接的情况下的破解

文章评论
发表评论

热门文章 sql server系统表损坏的解决方法 sql server系统表损坏的解决方法 SqlServer2005对现有数据进行分区具体步骤 SqlServer2005对现有数据进行分区具体步骤 解决SQL Server中Group无法实现的问题 解决SQL Server中Group无法实现的问题 SQL Server 2005降级到2000的正确操作步骤 SQL Server 2005降级到2000的正确操作步骤 手把手教你学会SQL Server镜像操作 手把手教你学会SQL Server镜像操作 实战手记:让百万级数据瞬间导入SQL Server 实战手记:让百万级数据瞬间导入SQL Server

相关下载

人气排行 配置和注册ODBC数据源-odbc数据源配置教程 如何远程备份(还原)SQL2000数据库 SQL2000数据库远程导入(导出)数据 SQL2000和SQL2005数据库服务端口查看或修改 修改Sql Server唯一约束教程 SQL Server 2005降级到2000的正确操作步骤 sql server系统表损坏的解决方法 浅谈JSP JDBC来连接SQL Server 2005的方法 SQL Server创建表语句介绍 MS-SQL2005服务器登录名、角色、数据库用户、角色、架构的关系 如何使用SQL Server中的客户端配置工具 SQL Server 分布式查询:OLE DB连接(一)