什麼時候用exists 什麼時候用in

2021-09-02 13:48:21 字數 3369 閱讀 4456

in

not in

exists

not exists

使用exists,oracle會首先檢查主查詢,然後執行子查詢直到它找到第乙個匹配項,這就節省了時間。oracle在執行in子查詢時,首先執行 子查詢,並將獲得的結果列表存放在乙個加了索引的臨時表中。在執行子查詢之前,系統先將主查詢掛起

,待子查詢執行完畢,存放在臨時表中以後再執行主查詢。 這也就是使用exists比使用in通常查詢速度快的原因。

1

)select

*from t1 where

exists

(select

1from t2 where t1.a=t2.a);2

)select

*from t1 where t1.a in

(select t2.a from t2)

;t1資料量小而t2資料量非常大時,t1 exits 效率高

t1資料量非常大而t2資料量小時,t1>>t2 時,2

)in 的查詢效率高。1)

select name from employee where name notin(

select name from student);2

)select name from employee where

notexists

(select name from student)

;

百思不得其解

後來發現sql報錯 不一定是 sql的錯 有時候資料也有原因

**例子

eg:

create

table a1

(id varchar2(10)

,name varchar2(10)

);create

table a

(id number,

name varchar2(10)

);create

table b1

(id number ,

aid varchar2(10)

,name varchar2(10)

);create

table b

(id number,

aid number,

name varchar2(10)

);insert

into a1 values(1

,'a1');

insert

into a1 values(2

,'a2');

insert

into a1 values

('a'

,'a3');

insert

into a values(1

,'a1');

insert

into a values(2

,'a2');

insert

into a values(3

,'a3');

insert

into b values(1

,1,'b1');

insert

into b values(2

,2,'b2');

insert

into b values(3

,2,'b3');

insert

into b1 values(1

,1,'b1');

insert

into b1 values(2

,2,'b2');

insert

into b1 values

('3'

,'a'

,'b3');

select

*from a1;

--相當於員工表

select

*from a;

select

*from b;

---相當於客戶經理

select

*from b1;

select

*from a left

join b1 on a.id=b1.aid ;

select

*from b1 where

exists

(select a.id from a where a.id=b1.aid)

;select

*from b1 where b1.aid in

(select a.id from a)

;

not exists 深入用法

問題 詳細描述 當exists 裡面的表 有多個條件的話

drop

table ck;

drop

table ck2;

create

table ck

(id number(10)

,id2 number(10)

,name varchar2(20)

);create

table ck2

(id number(10)

,id2 number(10)

,*** varchar2(20)

);insert

into ck values(1

,1,'張三');

insert

into ck values(2

,2,'李四');

insert

into ck values(3

,3,'王五');

insert

into ck values(4

,3,'週六');

insert

into ck values(5

,4,'77');

insert

into ck values(6

,5,'張三');

insert

into ck2 values(1

,1,'0000000000000000');

insert

into ck2 values(2

,1,'0000000000000000');

insert

into ck2 values(2

,2,'0000000000000000');

insert

into ck2 values(7

,3,'0000000000000000');

select

*from ck2 where

notexists

(select

*from ck where ck2.id=ck.id and ck.id2=ck2.id2 and ck.name<>

'00'

);

什麼時候用GET?什麼時候用POST?

get和post兩種方法都是將資料送到伺服器,但你該用哪一種呢?http標準包含這兩種方法是為了達到不同的目的。post用於建立資源,資源的內容會被編入http請示的內容中。例如,處理訂貨表單 在資料庫中加入新資料行等。當請求無 時 如進行搜尋 便可使用get方法 當請求有 時 如新增資料行 則用p...

什麼時候用堆,什麼時候用棧?

參考文章 c 面試題之記憶體分配 一 首先,回顧一下c c 的記憶體分配機制。乙個c c 程式編譯時記憶體分為5大儲存區 堆區 棧區 靜態區 全域性區 文字常量區 儲存字串常量 程式 區 存放二進位制程式 下面主要闡述前面三個。1 靜態儲存區域 靜態儲存區域的 內存在程式編譯時就已經分配好,這塊內存...

什麼時候用DFS,什麼時候用BFS

什麼時候用 dfs,什麼時候用 bfs?二維陣列的題目,n小於 20的,適用 dfs。而一般 n 200 n 1000 這種,一定不可能用 dfs去做。而且並不只是整個題目不能用 dfs,其中的 每一步也不能使用 dfs。bfs的基本步驟 1.將初始點 乙個或多個 加入乙個集合尾 2.從集合頭取出點...