In與Exists的區別

2021-07-03 18:45:33 字數 2115 閱讀 3790

這兩個函式是差不多的,但由於優化方案不同,通常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和父表關聯,查詢需要的結果是找到尚未有孩子的父親。我們來看...