如何巧妙利用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
)


猜你喜欢
- RSS是 Really Simple Syndication的缩写(对rss2.0而言,是这三个词的缩写,对rss1.0而言则是RDF Si
- 1.Vuex是什么?学院派:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式;集中存储和管理应用的所有组件状态。理解:以上这4
- 关于如何获取 access_token 这个可以自己查百度开放的OAuth 2.0 的 API。这里不做介绍。第三方 Python 库pos
- Oblog4.6 ACCESS版转换为UCenterHome1.5的全过程1、 说明:
- 两种写法。如图,4种重合情况和2种不重合情况。第一种写法:-- 时间段 a,b SELECT * FROM table WHER
- Django提供了一个新的类来帮助管理分页数据,这个类存放在django/core/paginator.py.它可以接收列表、元组或其它可迭
- 又发一个js版幻灯片,接口比较少,但功能和外观都还不错的,可自定义切换时间:)method: adRotator.initialize(容器
- 概述当我们使用组件库的时候,某些组件并不是直接放到模板当中进行使用,而是通过api的方式调用生成组件并且挂在到我们的页面中,其中最常见的就是
- 功能是:以一个关键字为索引,搜索整个数据库,然后返回那个关键字所在的表名和列名。(很赞...特别是入侵的时候找不到用户名与密码所在的表的时候
- 一、Oracle分析函数简介:在日常的生产环境中,我们接触得比较多的是OLTP系统(即Online Transaction Process)
- Mysql Table doesn't exist问题程序连接Mysql的时候总是提示表不存在,Table 'xx.QRTZ
- Ubuntu16.04自带python2.7与python3.5,某个项目编译却要求python版本大于等于3.7,遂考虑在原系统基础上再安
- 0x 00 返回值简介回顾下,上一节简单介绍了函数及其各种参数,其中也有简单介绍 print 和 return 的区别,print 仅仅是打
- 一、实验目标1、使用 K-means 模型进行聚类,尝试使用不同的类别个数 K,并分析聚类结果。2、按照 8:2 的比例随机将数据划分为训练
- 之前在使用Pandas处理csv文件时,发现如果文件名为中文,则会报错:OSError: Initializing from file fa
- 一、ROC与AUC很多学习器是为了测试样本产生的一个实值或概率预测,然后将这个预测值与一个分类阈值(threshold)进行比较,若大于阈值
- 我想让一片文章,每到3000字就分到下一条插入到数据库,求高手 <%Dim Content Conte
- 大家好,我是辣条。前言今天带来爬虫实战的第30篇文章。在挑选游戏的过程中感受学习,让你突飞猛进。python爬虫实战:steam逆向RSA登
- Access 操作很简单,具体不步骤如下:打开你mdb数据库,工具-->数据库实用工具-->压缩和修复数据库(c)... SQL SERVE
- 前言目前有一张tif格式的栅格影像,需要在web地图上进行展示,使用动态切片WMS的方式,渲染速度比较慢,而且大的时候会出现模糊的问题。并且