SQL----EXISTS 关键字

转自:http://blog.sina.com.cn/s/blog_65dbc6df0100mvfx.html

1.EXISTS基本意思

  英语解释就是存在,不过他的意思也差不多,相当于存在量词'З'。他不返回数据的,当后带带的查询为空值是,返回“FALSE”,非空则返回“TRUE”。

   就因为 EXISTS 返回的是真值或假值,所以他所带的子查询一般直接用'select *' 因为给出列名也没多少意义。

   其实,EXISTS属于相关子查询,也就是说子查询的条件依赖于外层父查询的查个属性值。比如:
select Sname
from Student
where exists (
      select *
      from SC                                 
      where Sno=Student.Sno and Cno ='1');
所说的依赖也就是这一句“ Sno=Student.Sno”。这里要说明一下,这个查询过程不是一般的自下而上执行,他与外查询依赖,执行的时候是先从父查询中取一个元组,然后根据条件 Sno=Student.Sno 处理内查询,得到结果再进行父查询中取第二个元组,如果反复。

可与NOT 连用,反意思反过来理解,如:
select Sname
from Student
where not esists (
      select *
      from SC
      where Sno=Student.Sno and Cno ='1');

EXISTS 的子查询,有一些是不能被其它形式的子查询等价替换的,但是所有 IN、比较运算符、ANY 和ALL的子查询都能用带有EXISTS 的子查询等价替换。但是在做的时候,请考虑效率问题,哪种高效用啊种,这是优化问题。

例如在上一篇 IN 的讲述中第一个例子,我们就可以改一下,变成:
select Sno,Sname,Sdept
from Student S1
where exists (
select *
from Student S2
where S2.Sdept=S1.Sdept and S2.Sname='A');

在这里,EXISTS只要知道内查询是否为空值就可以了,所以效率要比用IN的查询要高效一些。

2. 如何理解一下语句:

        SELECT Sname
        FROM Student
        WHERE NOT EXISTS
                    (SELECT *
                        FROM Course
                        WHERE NOT EXISTS
                                      (SELECT *
                                       FROM SC
                                       WHERE Sno= Student.Sno
                                             AND Cno= Course.Cno
                                       )
                       );

这个例子目的是查找数据库三个表中是否存在不对应的记录(各表应存在如下关系SC.Cno= Course.Cno ,sc.Sno= Student.Sno

)

它的功能和in有点类似,这条语句改成用in的方法就是这样,这样就比较容易理解了.

 

SELECT Sname FROM Student

WHERE Sno IN (SELECT Sno FROM SC WHERE Cno IN (SELECT Cno FROM Course))

3. exist与in的区别

in 和 exists也是很好区别的.

in 是一个集合运算符.

A   in {a,c,d,s,d....}

这个运算中,前面是一个元素,后面是一个集合,集合中的元素类型是和前面的元素一样的.

   而exists是一个存在判断,如果后面的查询中有结果,则exists为真,否则为假.

   in 运算用在语句中,它后面带的select 一定是选一个字段,而不是select *.

   比如说你要判断某班是否存在一个名为"小明"的学生,你可以用in 运算:

"小明" in

(select sname from student)

这样(select sname from student)

返回的是一个全班姓名的集合,in用于判断"小明"是否为此集合中的一个数据;

同时,你也可以用exists语句:

exists

(select * from student where sname="小明")

这两个涵数是差不多的, 但是由于优化方案的不同, 通常NOT

EXISTS要比NOT IN 要快, 因为NOT EXISTS可以使用结合算法而NOT IN 就不行了,而EXISTS则不如IN快,

因为这时候IN可能更多的使用结合算法.

select * from 表A where exists(select * from 表B

where 表B.id=表A.id)

这句相当于 

select * from 表A where id in (select id

from 表B)

:对于表A的每一条数据,都执行(select * from 表B where

B.id=表A.id )的存在性判断,如果表B中存在表A当前行相同的id,则exists为真,该行显示,否则不显示

exits适合内小外大的查询,in适合内大外小的查询

IN
确定给定的值是否与子查询或列表中的值相匹配。 
EXISTS
指定一个子查询,检测行的存在。


比较使用 EXISTS 和 IN 的查询
这个例子比较了两个语义类似的查询。第一个查询使用 EXISTS 而第二个查询使用 IN。注意两个查询返回相同的信息。 

USE

pubs
GO
SELECT DISTINCT pub_name
FROM publishers
WHERE EXISTS
(SELECT *
FROM titles
WHERE pub_id = publishers.pub_id
AND type = 'business')
GO

=============================================================
-- Or, using the IN clause:
USE pubs
GO
SELECT distinct pub_name
FROM publishers
WHERE pub_id IN
(SELECT

pub_id
FROM titles
WHERE type = 'business')
GO

下面是任一查询的结果集: 
pub_name
----------------------------------------
Algodata

Infosystems
New Moon Books

(2 row(s) affected)

exits 相当于存在量词:表示集合存在,也就是集合不为空只作用一个集合.例如 exist P

表示P不空时为真; not exist P表示p为空时 为真 in表示一个标量和一元关系的关系。例如:s in P表示当s与P中的某个值相等时为真; s

not in P 表示s与P中的每一个值都不相等时 为真

原文地址:https://www.cnblogs.com/sharpest/p/11406777.html