SQL----EXISTS关键字
转⾃:幽默表达自己饿了
1.EXISTS基本意思
英语解释就是存在,不过他的意思也差不多,相当于存在量词'З'。他不返回数据的,当后带带的查询为空值是,返回“FALSE”,⾮空则返回“TRUE”。
就因为 EXISTS 返回的是真值或假值,所以他所带的⼦查询⼀般直接⽤'lect *' 因为给出列名也没多少意义。
其实,EXISTS属于相关⼦查询,也就是说⼦查询的条件依赖于外层⽗查询的查个属性值。⽐如:
会议精神心得体会lect Sname
from Student
where exists (
lect *
from SC
where Sno=Student.Sno and Cno ='1');
所说的依赖也就是这⼀句“ Sno=Student.Sno”。这⾥要说明⼀下,这个查询过程不是⼀般的⾃下⽽上执⾏,他与外查询依赖,执⾏的时候是先从⽗查询中取⼀个元组,然后根据条件 Sno=Student.Sno 处理内查询,得到结果再进⾏⽗查询中取第⼆个元组,如果反复。
可与NOT 连⽤,反意思反过来理解,如:
lect Sname
from Student
where not esists (
lect *
from SC
where Sno=Student.Sno and Cno ='1');
EXISTS 的⼦查询,有⼀些是不能被其它形式的⼦查询等价替换的,但是所有 IN、⽐较运算符、ANY 和ALL的⼦查询都能⽤带有EXISTS 的⼦查询等价替换。但是在做的时候,请考虑效率问题,哪种⾼效⽤啊种,这是优化问题。
例如在上⼀篇 IN 的讲述中第⼀个例⼦,我们就可以改⼀下,变成:
lect Sno,Sname,Sdept
from Student S1
where exists (
lect *
from Student S2
where S2.Sdept=S1.Sdept and S2.Sname='A');
在这⾥,EXISTS只要知道内查询是否为空值就可以了,所以效率要⽐⽤IN的查询要⾼效⼀些。
2. 如何理解⼀下语句:
SELECT Sname
FROM Student
WHERE NOT EXISTS
(SELECT *
FROM Cour
WHERE NOT EXISTS
(SELECT *
FROM SC
数量关系是什么
WHERE Sno= Student.Sno
AND Cno= Cour.Cno农村产业发展规划
)
)
;
这个例⼦⽬的是查找数据库三个表中是否存在不对应的记录(各表应存在如下关系SC.Cno= Cour.Cno ,sc.Sno= Student.Sno
)
它的功能和in有点类似,这条语句改成⽤in的⽅法就是这样,这样就⽐较容易理解了.
SELECT Sname FROM Student
WHERE Sno IN (SELECT Sno FROM SC WHERE Cno IN (SELECT Cno FROM Cour))
3. exist与in的区别
in 和 exists也是很好区别的.
in 是⼀个集合运算符.
A in {a,c,d,}
这个运算中,前⾯是⼀个元素,后⾯是⼀个集合,集合中的元素类型是和前⾯的元素⼀样的.
⽽exists是⼀个存在判断,如果后⾯的查询中有结果,则exists为真,否则为假.
in 运算⽤在语句中,它后⾯带的lect ⼀定是选⼀个字段,⽽不是lect *.
⽐如说你要判断某班是否存在⼀个名为"⼩明"的学⽣,你可以⽤in 运算:
"⼩明" in
(lect sname from student)
这样(lect sname from student)
返回的是⼀个全班姓名的集合,in⽤于判断"⼩明"是否为此集合中的⼀个数据;
同时,你也可以⽤exists语句:
exists
(lect * from student where sname="⼩明")
新学期标语这两个涵数是差不多的, 但是由于优化⽅案的不同, 通常NOT
EXISTS要⽐NOT IN 要快, 因为NOT EXISTS可以使⽤结合算法⽽NOT IN 就不⾏了,⽽EXISTS则不如IN快,
因为这时候IN可能更多的使⽤结合算法.
lect * from 表A where exists(lect * from 表B
where 表B.id=表A.id)
这句相当于
lect * from 表A where id in (lect id
from 表B)
:对于表A的每⼀条数据,都执⾏(lect * 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 clau:
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中的每⼀个值都不相等时为真