SQL中EXISTS的用法

转载 2013年12月02日 11:28:42

http://blog.csdn.net/xiwu1616/article/details/14160855


比如在Northwind数据库中有一个查询为
SELECT c.CustomerId, CompanyName FROM Customers c
WHERE EXISTS(
SELECT OrderID FROM Orders o WHEREo.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,这一行行可作为外查询的结果行,否则不能作为结果。


在插入记录前,需要检查这条记录是否已经存在,只有当记录不存在时才执行插入操作,可以通过使用 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中exists关键字的用法

exists用于检查一个子查询是否至少会返回一行数据(即检测行的存在),返回值为true或false。     语法: exists subquery     参数: subquery 是一个受限的 ...
  • wangshuxuncom
  • wangshuxuncom
  • 2013年11月05日 17:11
  • 8474

SQL语句中exists/not exists的用法分析

1、Student: Sno Sname Ssex Sage Sdept 200215121 李勇 男 20 CS 200215122 刘晨...
  • wozengcong
  • wozengcong
  • 2015年05月18日 13:20
  • 20676

sql语句中exists和in用法的区分

初学java两个多月,这两天在整理老师的笔记对数据库中的exists和in的用法分不清楚,从网上搜了些资料,作了点总结。 一、问题起因 起初是由两条语句执行结果不同,语句如下: --分析以下结果...
  • U___U
  • U___U
  • 2015年03月27日 15:25
  • 4249

SQL中IN和EXISTS用法的区别,sql中exists,not exists的用法

NOT IN SELECT DISTINCT MD001 FROM BOMMD WHERE MD001 NOT IN (SELECT MC001 FROM BOMMC) NOT EXISTS,ex...
  • wozengcong
  • wozengcong
  • 2015年05月18日 09:28
  • 5880

数据库sql语句的exists总结

数据库sql语句的exists总结 sql exists in 学习   先来比较下语法: --deals=交易表,areas=地域表,例如香港;我们的目的:查看有交易的地域 ...
  • u010408365
  • u010408365
  • 2015年05月08日 14:50
  • 1671

SQL中EXISTS自己的一些用法和理解。

EXISTS 是判断是否存在,和in类似,但效率要比in高
  • zlhxiaohui
  • zlhxiaohui
  • 2014年10月11日 19:45
  • 1135

sql语句中not in和exists 的用法以及更新两个表数据的插入实例

exists 与 in 最大的区别在于 in引导的子句只能返回一个字段,exists : 强调的是是否返回结果集,不要求知道返回什么,...
  • dxnn520
  • dxnn520
  • 2016年10月29日 14:37
  • 1526

sql中exists,not exists的用法 和in()的区别

sql中exists,not exists的用法 exists : 强调的是是否返回结果集,不要求知道返回什么, 比如:   select name from student where sex ...
  • qq_28923283
  • qq_28923283
  • 2016年04月18日 21:54
  • 122

sql语句中的 in 、not in 、exists、not exists 详细用法说明和差别----not in失效

 2016攒课第二期之你听课我买单,快来攒你想听的课!     架构免费公开课报名     【UDN沙龙】Intel大拿分享HTML5时代的跨平台开发解 ...
  • hewusheng10
  • hewusheng10
  • 2016年04月15日 11:16
  • 711

【SQL】IN、EXISTS和表连接三者的效率比较

一、 IN和EXISTS比较 在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行查询。此时就会用到IN和EXISTS。 例如:查询departments表中存在的部门的人数。 1、 ...
  • NextAction
  • NextAction
  • 2017年04月27日 14:00
  • 1506
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SQL中EXISTS的用法
举报原因:
原因补充:

(最多只允许输入30个字)