网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > 数据库 > SQL技巧
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
数据库:数据库教程,数据库技巧,Oracle教程,MySQL教程,Sybase教程,Access教程,DB2教程,数据库安全,数据库文摘
本月文章推荐
.TOPN 子句与SET ROWCOUNTN 之对比 .
.SQL Server 2008的新压缩特性.
.查询数据库表和字段sql语句.
.当您安装SQL Server 2005或94810.
.收集SQL Server统计信息.
.深入探讨纯软件方式的双机热备解.
.扩展数据库系统选项实现更高的可.
.怎么清除sql server日志.
.SELECT查询的应用(三).
.SQL Server 存储过程嵌套示例.
.获取sql数据库所有表结构.
.SQL 视图效率和连接超时设置.
.有关BCB连接Informix数据库的参考.
.安装Ms SQL Server 2005 开发版时.
.简明扼要的讲解数据仓库所拥有的.
.优化数据库的方法及SQL语句优化的.
.将一个更新划分为几个批次.
.通过rownum隐式游标实现与TOP相似.
.Link Server的语法.
.使用SQL Mail收发和自动处理邮件.

实例讲解SQL Server中非常有用EXISTS结构

发表日期:2008-3-25


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)
上一篇:怎样才能实现排序优化的层次关系表设计 人气:1276
下一篇:改变默认设置并且给每个文件指定位置 人气:963
浏览全部SQL Server的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐