這兩個函式是差不多的,但由於優化方案不同,通常not exists要比not in要快,因為not exists可以使用結合演算法而not in就不行了,而exists則不如in快,因為這時候in可能更多的使用結合演算法。
select * from tablea where exists(select * from tableb where tableb.id=tablea.id)
這句相當於:select * from tablea where id in (select id from tableb)
對於表tablea的每一條資料,都執行select * from tableb where tableb.id=tablea.id的存在性判斷,如果表tableb中存在表tablea當前行相同的id,則exists為真,該行顯示,否則不顯示。
-----in 和not in-----
----哪些部門中有雇員工資大於?-----
select * from department where department.deptid=
(select fdeptid from employee where employee.empsalary>7000)
----報錯資訊如下:子查詢返回的值多於乙個........
----msg 512, level 16, state 1, line 1
----subquery returned more than 1 value. this is not permitted when the
----subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.---
----改正:將「=」改為「in」
select * from department where department.deptid in
(select fdeptid from employee where employee.empsalary>7000)
go----not in
select * from department where department.deptid in
(select fdeptid from employee where employee.empsalary>7000)
go-----exists 和not exists-----一般用於if語句的存在檢測
----工資改革,檢查雇員工資,達到以上的,每人提高,否則每人提高-----
/*--採用exists子查詢,進行酌情提公升--*/
select * from employee
goif exists (select * from employee where empsalary>7000)
begin
print '有人工資達到,則每人提高,提高後工資為:'
update employee set empsalary=empsalary+300
select * from employee
endelse
begin
print '無人工資達到,則每人提高,提高後工資為:'
update employee set empsalary=empsalary+500
select * from employee
endgo
----in和exists---
select distinct deptname from department
where exists(select * from employee where empgender=1)
goselect distinct deptname from department
where deptid in(select fdeptid from employee where empgender=1)
go----exists相當於存在量詞:表示集合存在,也就是集合不為空只作用於乙個集合。
----exists p表示p不為空時為真;not exists p表示p為空時,為真。
----in表示乙個標量和醫院關係的關係。s in p表示當s與p中的某個值相等時為真;
----s not in p表示s與p中的每乙個值都不相等時,為真。
Exists與In的區別
最近在check專案的資料庫,check到儲存過程,裡面看到儲存過程有用到in 和 exsits.整理下 in 和 exsits 的區別 in 是把外表和內錶做hash join,而exists是對外表做loop,每次loop再對內表進行查詢.如此,exists適合外表結果集很小的情況.其他情況則使...
In與Exists的區別
這兩個函式是差不多的,但由於優化方案不同,通常not exists要比not in要快,因為not exists可以使用結合演算法二not in就不行了,而exists則不如in快,因為這時候in可能更多的使用結合演算法。select from tablea where exists select ...
ORACLE in與exists語句的區別
業務問題大概可以這樣描述,乙個父表,乙個子表,查詢的結果是找到子表中沒有使用父表id的記錄,這種情況估計很多系統都會牽涉得到。讓我們來舉乙個例子 表一 父表 parent 表二 子表 childen 父表儲存父親,子表儲存孩子,然後通過pid和父表關聯,查詢需要的結果是找到尚未有孩子的父親。我們來看...