转自:https://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适合于外表小而内表大的情况。

------------------------------------------------------------------------

in 和exists
in是把外表和内表作hash 连接,而exists 是对外表作loop 循环,每次loop 循环再对内表进行查询。

一直以来认为exists 比in 效率高的说法是不准确的。如果查询的两个表大小相当,那么用in 和exists 差别不大。

如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in:

例如:

表A(小表),表B(大表)1:

select * from A where cc in (select cc from B)

效率低,用到了A 表上cc 列的索引;

select * from A where exists(select cc from B where cc=A.cc)
 
效率高,用到了B 表上cc 列的索引。

相反的2:

select * from B where cc in (select cc from A)
 
效率高,用到了B 表上cc 列的索引;

select * from B where exists(select cc from A where cc=B.cc)
 
效率低,用到了A 表上cc 列的索引。

not in 和not exists
如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;

而not extsts 的子查询依然能用到表上的索引。所以无论那个表大,用not exists 都比not in 要快。

转载于:https://www.cnblogs.com/fengff/p/8287821.html

sql中exist()的用法相关推荐

  1. SQL中Truncate的用法

    转自:https://www.cnblogs.com/zhoufangcheng04050227/p/7991759.html 本文导读:删除表中的数据的方法有delete,truncate, 其中T ...

  2. 【SQL中limit的用法】

    SQL中limit的用法 说明:limit子句用于限制查询结果返回的数量,常用于分页查询. 用法:[select * from tableName limit i,n ] 参数:tableName: ...

  3. sql去重复操作详解SQL中distinct的用法

    在表中,可能会包含重复值.这并不成问题,不过,有时您也许希望仅仅列出不同(distinct)的值.关键词 distinct用于返回唯一不同的值. 表A: 表B: 1.作用于单列 select dist ...

  4. sql 中exist用法

    转载来自:http://www.cnblogs.com/cjm123/p/8177017.html 非常感谢原作者 sql中exists,not exists的用法 exists : 强调的是是否返回 ...

  5. SQL中的declare用法

     平时写SQL查询.存储过程都是凭着感觉来,没有探究过SQL的具体语法,一直都是按c#那一套往SQL上模仿,前几天项目中碰到一个问题引起了我对declare定义变量的作用域的兴趣. 大家都知道c# ...

  6. SQL中的limit用法

    limit用法 SQL中的limit函数是用来对数据库中的字段进行限制提取的,如:一个用户表中有许多的用户信息,如果想要取出其中某个位置的某几条数据,就可以使用limit函数. 结构 limit函数结 ...

  7. 教你学会Sql中 ROW_NUMBER的用法

    ROW_NUMBER SqlServer 2005 推出的新功能.语法:select *,ROW_Number() over(order by 字段) as '新列名' from table顾名思义: ...

  8. SQL中Case语句用法讨论

    Case具有两种格式.简单Case函数和Case搜索函数. --简单Case函数 CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '其他' END ...

  9. SQL中CONVERT()函数用法详解

    SQL中CONVERT函数格式: CONVERT(data_type,expression[,style]) 参数说明: expression 是任何有效的 Microsoft® SQL Server ...

  10. sql中Exist用法

    文章目录 一.单表测试 select null ①SELECT COUNT(*) ②select null会得到什么数据 ③加个where条件试试: ④那么如果查询一个表中不存在的数据会怎样呢? ⑤加 ...

最新文章

  1. dumpbin发现没有入口函数_详解VS2019 dumpbin查看DLL的导出函数
  2. ICML2020 | 神经网络的图结构如何影响其预测性能?
  3. 利用Graphviz 画结构图
  4. android sdk 更新用的HOSTS
  5. signature=78718ebfda6f8d955fae3e9c9c284f5d,SKI SAFETY BINDING WITH SWIVELLING SOLE PLATE
  6. 屏幕适配 部分知识点总结,CSDN小冰原创
  7. DB Stack Overflow
  8. Mavne安装Jboss
  9. 吴恩达机器学习(八)偏差与方差
  10. cms不支持mysql_CMS不要让MySQL为你流泪
  11. 微信小程序开发(一):小程序代码构成
  12. CCF推荐的A类、B类、C类中文科技期刊
  13. Prescan入门教程之避坑笔记:初学者初用
  14. java怎么求传递闭包_利用定义求解传递闭包的关系矩阵
  15. 中国大学MOOC行为金融学及答案
  16. 服务器无线组网,物联网无线组网介绍
  17. element实现el-progress线形进度条渐变色
  18. 同态滤波 matlab,基于Matlab的同态滤波器的优化设计
  19. 微信小程序淘宝首页双排图片布局排版代码
  20. Windows上解除宽带限速(网速明显提升)

热门文章

  1. Spring 最常用的 7 大类注解,女媛史上最强整理!
  2. 推荐几个非常有用的工具
  3. JVM的4种垃圾回收算法、垃圾回收机制与总结
  4. (转载)用C#实现MySQL建库及建表
  5. Servlet 快速开始 表单中文字段
  6. 使用C语言操作InfluxDB
  7. 猎豹MFC--图片控件CStatic和动画控件CAnimateCtrl
  8. 利用反射实现工厂模式
  9. document.execCommand() 命令详解 只支持IE
  10. net_sf_interfacecpp项目诞生宣言