`
wangchongbiao
  • 浏览: 52684 次
  • 性别: Icon_minigender_1
  • 来自: 河北、沧州
社区版块
存档分类
最新评论

exists的简单理解

    博客分类:
  • SQL
阅读更多

转自:http://www.cnblogs.com/netserver/archive/2008/12/25/1362615.html

 

比如在Northwind数据库中有一个查询为

 

SELECT c.CustomerId,CompanyName FROM Customers c
WHERE EXISTS(
SELECT OrderID FROM Orders o WHERE o.CustomerID=c.CustomerID) 

 
这里面的EXISTS是如何运作呢?子查询返回的是OrderId字段,可是外面的查询要找的是CustomerID和CompanyName字段,这两个字段肯定不在OrderID里面啊,这是如何匹配的呢?

EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False
EXISTS 指定一个子查询,检测 行 的存在。

语法: EXISTS subquery
参数: subquery 是一个受限的 SELECT 语句 (不允许有 COMPUTE 子句和 INTO 关键字)。
结果类型: Boolean 如果子查询包含行,则返回 TRUE ,否则返回 FLASE 。

例表A:TableIn 例表B:TableEx


(一). 在子查询中使用 NULL 仍然返回结果集

 

select * from TableIn where exists(select null)

 
等同于: select * from TableIn

(二). 比较使用 EXISTS 和 IN 的查询。注意两个查询返回相同的结果。

 

select * from TableIn where exists(select BID from TableEx where BNAME=TableIn.ANAME)
select * from TableIn where ANAME in(select BNAME from TableEx)

 

(三). 比较使用 EXISTS 和 = ANY 的查询。注意两个查询返回相同的结果。

 

select * from TableIn where exists(select BID from TableEx where BNAME=TableIn.ANAME);
select * from TableIn where ANAME=ANY(select BNAME from TableEx);

 

NOT EXISTS 的作用与 EXISTS 正好相反。如果子查询没有返回行,则满足了 NOT EXISTS 中的 WHERE 子句。

结论:
EXISTS(包括 NOT EXISTS )子句的返回值是一个BOOL值。 EXISTS内部有一个子查询语句(SELECT ... FROM...), 我将其称为EXIST的内查询语句。其内查询语句返回一个结果集。 EXISTS子句根据其内查询语句的结果集空或者非空,返回一个布尔值。

一种通俗的可以理解为:将外查询表的每一行,代入内查询作为检验,如果内查询返回的结果取非空值,则EXISTS子句返回TRUE,这一行行可作为外查询的结果行,否则不能作为结果。

分析器会先看语句的第一个词,当它发现第一个词是SELECT关键字的时候,它会跳到FROM关键字,然后通过FROM关键字找到表名并把表装入内存。接 着是找WHERE关键字,如果找不到则返回到SELECT找字段解析,如果找到WHERE,则分析其中的条件,完成后再回到SELECT分析字段。最后形 成一张我们要的虚表。
WHERE关键字后面的是条件表达式。条件表达式计算完成后,会有一个返回值,即非0或0,非0即为真(true),0即为假(false)。同理WHERE后面的条件也有一个返回值,真或假,来确定接下来执不执行SELECT。
分析器先找到关键字SELECT,然后跳到FROM关键字将STUDENT表导入内存,并通过指针找到第一条记录,接着找到WHERE关键字计算它的条件 表达式,如果为真那么把这条记录装到一个虚表当中,指针再指向下一条记录。如果为假那么指针直接指向下一条记录,而不进行其它操作。一直检索完整个表,并 把检索出来的虚拟表返回给用户。EXISTS是条件表达式的一部分,它也有一个返回值(true或false)。

在插入记录前,需要检查这条记录是否已经存在,只有当记录不存在时才执行插入操作,可以通过使用 EXISTS 条件句防止插入重复记录。

 

INSERT INTO TableIn (ANAME,ASEX)
SELECT top 1 '张三', '男' FROM TableIn
WHERE not exists (select * from TableIn where TableIn.AID = 7);

 

EXISTS与IN的使用效率的问题,通常情况下采用exists要比in效率高,因为IN不走索引,但要看实际情况具体使用:
IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况。

分享到:
评论

相关推荐

    sql not in 与not exists使用中的细微差别

    上面两个简单的Sql,我们从表面理解,查询的最终结果应该是一样的,但实际结果却和我们想象的不一样 第一条sql查询的结果有一条数据 第二条sql查询的结果却为空  原因: not exists的子查询,对于子查询不返回行和...

    php-br:一个简单的巴西葡萄牙语PHP函数库,以帮助难以理解英语功能的新手开发人员进行理解和初步学习

    测试3php-br 一个简单的巴西葡萄牙语PHP函数库,以帮助难以理解英语功能的新手开发人员理解和学习。原因为什么开发这个库? 当向不懂英语的学生教授PHP类时,我意识到,通过使用葡萄牙语创建与原始功能具有相同功能...

    艾恩ASP无组件上传简单 示例

    新增加两个简单示例,是更容易理解该类的方便之处 4.增加了读取文件二进制的方法,可以将二进制数据保存到数据库 5.为方便演示去掉了防刷新 2008-8-20日: 1.增加了对于隐藏程序真实扩展名上传可执行文件进行封杀...

    Simple Down 简单下载系统 v6.2.zip

    Simple Down 简单下载系统6.2 更新内容及安装更新方法 1 修正上6.1版本首页标题不显示的问题 2 详情页面的关键词和内容摘要可自由填写。如果不填写则默认为标签加上系统设置里面的内容和标题加系统设置里面的内容...

    数据库实验报告 SQL查询 ,子查询组合

    (2)使用In、比较符和Exists操作符进行嵌套查询操作。 (3)分组查询,包括分组条件表达、选择组条件表达的方法。 (4)集合查询。 (5)使用视图创建语句建视图,通过视图查询数据 (6)带子查询的修改和删除 ...

    PHP和MySQL Web开发第4版pdf以及源码

    2.8.1 查看文件是否存在:file_exists() 2.8.2 确定文件大小:filesize() 2.8.3 删除一个文件:unlink() 2.8.4 在文件中定位:rewind()、fseek()和ftell() 2.9 文件锁定 2.10 更好的方式:数据库管理系统 ...

    PHP和MySQL WEB开发(第4版)

    2.8.1 查看文件是否存在:file_exists() 2.8.2 确定文件大小:filesize() 2.8.3 删除一个文件:unlink() 2.8.4 在文件中定位:rewind()、fseek()和ftell() 2.9 文件锁定 2.10 更好的方式:数据库管理系统 2.10.1 ...

    PHP和MySQL Web开发第4版

    2.8.1 查看文件是否存在:file_exists() 2.8.2 确定文件大小:filesize() 2.8.3 删除一个文件:unlink() 2.8.4 在文件中定位:rewind()、fseek()和ftell() 2.9 文件锁定 2.10 更好的方式:数据库管理系统 ...

    Grails权威指南

     4.6.1 使用get方法和exists方法进行基本查询  4.6.2 列举(listing),70排序(sorting)以及合计(counting)  4.6.3 用动态查找器(finder)查询  4.6.4 使用hql进行查询  4.6.5 按样本...

    mysql基础只是总结

    3、配置文件中简单的字段的理解 【mysql的登录与退出】 1、通过图形化界面 phpmyadmin mysqlGUI Navicat for MySQL 2、DOS登录或者自带的MySQL Command Line Client mysql -h IP或者域名 -u username -p -P ...

    LECCO SQL Expert (智能自动SQL优化)

    图7 在线执行计划帮助 如果觉得对写法的改变难以理解,还可以点中“执行计划”复选框,通过比较两条SQL语句的执行计划的不同来了解为什么两条SQL在性能上有差异。在查看执行计划过程中如果有什么不明白的地方,可以...

    lecco sql export pro(SQL优化器)

    当然,你也可以从 源语句和重写后的SQL语句中任选两条进行比较 <br> 从比较的结果可以看到,重写得到的SQL124把第一个Exists改写成了In;在字段DPT_ID上进行了合并空字符串的操作以诱导数据库先执行子查询中的...

    Java数据库编程宝典2

    1.1 理解关系型数据库管理系统 1.1.1 关系模型 1.1.2 Codd法则 1.1.3 表、行、列和关键字 1.1.4 主键 1.1.5 外键 1.1.6 关系 1.1.7 视图 1.1.6 范式化 1.2 高级语言 1.2.1 结构化查询语言 1.2.2 数据...

    Java数据库编程宝典4

    1.1 理解关系型数据库管理系统 1.1.1 关系模型 1.1.2 Codd法则 1.1.3 表、行、列和关键字 1.1.4 主键 1.1.5 外键 1.1.6 关系 1.1.7 视图 1.1.6 范式化 1.2 高级语言 1.2.1 结构化查询语言 1.2.2 数据...

    Java数据库编程宝典1

    1.1 理解关系型数据库管理系统 1.1.1 关系模型 1.1.2 Codd法则 1.1.3 表、行、列和关键字 1.1.4 主键 1.1.5 外键 1.1.6 关系 1.1.7 视图 1.1.6 范式化 1.2 高级语言 1.2.1 结构化查询语言 1.2.2 数据...

    Java数据库编程宝典3

    1.1 理解关系型数据库管理系统 1.1.1 关系模型 1.1.2 Codd法则 1.1.3 表、行、列和关键字 1.1.4 主键 1.1.5 外键 1.1.6 关系 1.1.7 视图 1.1.6 范式化 1.2 高级语言 1.2.1 结构化查询语言 1.2.2 数据...

    SQL Server 2008编程入门经典(第3版)

    7.4 EXISTS运算符 7.5 混合数据类型:CAST和CONVERT 7.6 MERGE命令 7.6.1 BYl.ARGET和BYSOURCE 7.6.2 OUTPUT子句 7.7 性能方面的考虑 7.8 本章小结 7.9 练习 第8章 规范化和其他基本设计问题 8.1 表 8.2 保持数据...

    SQL.Server.2008编程入门经典(第3版).part1.rar

    7.4 EXISTS运算符 7.5 混合数据类型:CAST和CONVERT 7.6 MERGE命令 7.6.1 BYl.ARGET和BYSOURCE 7.6.2 OUTPUT子句 7.7 性能方面的考虑 7.8 本章小结 7.9 练习 第8章 规范化和其他基本设计问题 8.1 表 8.2 保持数据...

    SQL.Server.2008编程入门经典(第3版).part2.rar

    7.4 EXISTS运算符 7.5 混合数据类型:CAST和CONVERT 7.6 MERGE命令 7.6.1 BYl.ARGET和BYSOURCE 7.6.2 OUTPUT子句 7.7 性能方面的考虑 7.8 本章小结 7.9 练习 第8章 规范化和其他基本设计问题 8.1 表 8.2 保持数据...

Global site tag (gtag.js) - Google Analytics