【SQL】exists

王曉斌發表於2014-04-22

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)



相關文章