【SQL】exists

exists用来判断是否存在的;当exists(查询)存在结果时,返回TRUE,否则返回FALSE。

not exists与之相反。


exists V.S. in

如果查询的两个表大小相当,则exists与in的差别不大。

如果两个表中一个较大,一个较小,则子查询表大的用exits,子查询表小的用in。

例如表A(小表),表B(大表),则:

select * from A where cc in (select cc from B)
 
 

 
 

效率低,用到了表A上cc列的索引。

select * from A where exists(select cc from B where cc=A.cc)

效率高,用到了表B上cc列的索引。


另外,在in后的查询语句中,只能有一个表达式,如

select * from A where cc in (select cc from B)       // OK
select * from A where cc in (select cc , id from B)  // ERROR


而exists的子查询语句可以有多个表达式.

在Update中使用exists

当exists用于update中的where条件时,当exits返回TRUE,则执行update,否则不执行。


如下两张表:

select * from EXISTSTABLE1

id name
1 a
2 b
3 c

select * from EXISTSTABLE2

id name
1 d
3 e

不使用exists更新表1中的值

update EXISTSTABLE1 set name = (select name from EXISTSTABLE2 where EXISTSTABLE1.id = EXISTSTABLE2.id)

表1中的结果:

id name
1 d
2 NULL
3 e

(3 row(s) affected)

使用exists更新表1中的值

update EXISTSTABLE1 set name = (select name from EXISTSTABLE2 where EXISTSTABLE1.id = EXISTSTABLE2.id)
where exists (select 1 from EXISTSTABLE2 where EXISTSTABLE1.id = EXISTSTABLE2.id)

表1中的结果:

id name
1 d
2 b
3 e

(2 row(s) affected)



你可能感兴趣的:(sql)