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无值返回真所以没有数据