EXISTS 
使用EXISTS(或NOT EXISTS)关键字引入一个子查询时,子查询实际上不产生任何数据;它只返回TRUE或FALS值。
指定一个子查询,检测行的存在。 
如果子查询包含行,则返回 TRUE

IN效率要差(返回子查询)

select * from t

id          upperid     
----------- ----------- 
3           2
4           1
5           3
6           4

select * from t
where  EXISTS (SELECT NULL) 


id          upperid     
----------- ----------- 
3           2
4           1
5           3
6           4


//

if object_id('a','u') is not null drop table a
go

create table a
(id int identity(1,1),name varchar(2))
go

insert into a
select 'A1' 
union all select 'A2'
union all select 'A3'
go

select * from a

id          name 
----------- ---- 
1           A1
2           A2
3           A3

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

if object_id('b','u') is not null drop table b
go

create table b
(id int identity(1,1),aid int,name varchar(2))
go

insert into b
select 1,'B1' 
union all select 2,'B2'
union all select 2,'B3'
go

select * from b

id          aid         name 
----------- ----------- ---- 
1           1           B1
2           2           B2
3           2           B3

---------------------------表A和表B是1对多的关系EXISTS  A.ID   =>   B.AID  
SELECT ID,NAME FROM A WHERE ID IN (SELECT AID FROM B) 

SELECT ID,NAME FROM   A   
WHERE   EXISTS   (SELECT   *   FROM   B   WHERE   A.ID=B.AID) 

ID          NAME 
----------- ---- 
1           A1
2           A2
---------------------------NOT   EXISTS   就是反过来
SELECT ID,NAME FROM A WHERE ID not IN (SELECT AID FROM B) 
 
SELECT   ID,NAME   FROM   A   WHERE NOT EXISTS (SELECT   *  FROM   B   WHERE  A.ID=B.AID) 

ID          NAME 
----------- ---- 
3           A3
-----------------------------------------

exists做为where 条件时,是先对where 前的主查询询进行查询,然后用主查询的结果一个一个的代入exists的查询进行判断,
如果为真则输出当前这一条主查询的结果,否则不输出


原因可以按照如下分析
SELECT ID , NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID = 1)
-->SELECT * FROM B WHERE B.AID = 1有值返回真所以有数据

SELECT ID , NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID = 2)
-->SELECT * FROM B WHERE B.AID = 2有值返回真所以有数据

SELECT ID , NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID = 3)
-->SELECT * FROM B WHERE B.AID = 3无值返回真所以没有数据


 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐