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

作者:yashi 时间:2009-02-19 17:36:00 

有件东西我观察了很多年,那就是很少有开发者会去使用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
)

标签:巧妙利用,SQL,Server,EXISTS结构
0
投稿

猜你喜欢

  • document.getElementById的简写方式

    2010-06-21 10:44:00
  • Go语言中的range用法实例分析

    2024-04-30 10:03:18
  • pyqt5打包成exe可执行文件的方法

    2022-02-09 11:25:57
  • Symfony2之session与cookie用法小结

    2023-11-22 02:58:30
  • YUI3新特性学习

    2012-04-26 16:25:20
  • 详述numpy中的np.random.random()系列函数用法

    2023-08-08 00:25:09
  • 解决TensorFlow GPU版出现OOM错误的问题

    2021-09-10 10:27:44
  • python脚本之一键移动自定格式文件方法实例

    2021-08-13 09:41:55
  • 你是一个职业的页面重构工作者吗?

    2008-09-29 12:07:00
  • 解决编码问题:UnicodeDecodeError: 'utf-8' codec can't decod

    2023-03-25 02:45:59
  • Scrapy模拟登录赶集网的实现代码

    2023-02-22 20:33:47
  • 在 mysql 中 定义 数据库,表,列时,设定的各个的编码格式

    2010-11-11 11:58:00
  • 从基础开始建立一个JS代码库第1/2页

    2024-04-16 10:40:59
  • python基于twisted框架编写简单聊天室

    2021-12-12 17:56:51
  • 浅析Oracle中sys、system和Scott用户下的数据库连接问题

    2023-07-02 15:14:06
  • Python中的赋值、浅拷贝、深拷贝介绍

    2023-09-29 06:01:54
  • 通过实例学习Python Excel操作

    2021-01-21 21:55:12
  • Python操作word常见方法示例【win32com与docx模块】

    2022-09-22 13:12:33
  • python遍历类中所有成员的方法

    2022-11-16 22:29:00
  • 单利模式及python实现方式详解

    2021-07-21 21:45:15
  • asp之家 网络编程 m.aspxhome.com