转自:http://blog.sina.com.cn/s/blog_65dbc6df0100mvfx.html
1.EXISTS基本意思
'З'。他不返回数据的,当后带带的查询为空值是,返回“FALSE”,非空则返回“TRUE”。
EXISTS属于相关子查询,也就是说子查询的条件依赖于外层父查询的查个属性值。比如:
select Sname
from Student
where exists (
所说的依赖也就是这一句
可与
select Sname
from Student
where not esists (
IN、比较运算符、ALL的子查询都能用带有
select Sno,Sname,Sdept
from Student S1
where exists (
select *
from Student S2
where S2.Sdept=S1.Sdept and S2.Sname='A');
在这里,EXISTS只要知道内查询是否为空值就可以了,所以效率要比用IN的查询要高效一些。
SELECT *
这个例子目的是查找数据库三个表中是否存在不对应的记录(各表应存在如下关系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的区别
exists也是很好区别的.
.
这个运算中,前面是一个元素,后面是一个集合,集合中的元素类型是和前面的元素一样的.
exists是一个存在判断,如果后面的查询中有结果,则exists为真,否则为假.
,它后面带的,而不是select *.
"小明"的学生,你可以用:
"小明" in
(select sname from student)
这样(select sname from student)
返回的是一个全班姓名的集合,in用于判断"小明"是否为此集合中的一个数据;
ͬʱ,你也可以用exists语句:
exists
(select * from student where sname="小明")
这两个涵数是差不多的NOT
EXISTS要比NOT EXISTS可以使用结合算法而NOT IN 就不行了,而EXISTS则不如IN快,
因为这时候IN可能更多的使用结合算法.
B
B.id=表A.id)
A where id in (select id
B)
:对于表A的每一条数据,都执行(B where
表B.id=表,如果表B中存在表A当前行相同的id,则exists为真,该行显示,否则不显示
exits适合内小外大的查询,in适合内大外小的查询
IN
EXISTS
指定一个子查询,检测行的存在。
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)
,也就是集合不为空只作用一个集合exist P
表示P不空时为真; not exist P表示in表示一个标量和一元关系的关系。例如:s in P表示当s与P中的某个值相等时为真; s
s与P中的每一个值都不相等时 为真
来源:博客园
作者:Sharpest
链接:https://www.cnblogs.com/sharpest/p/11406777.html