oracle中exists與in的使用方法

2021-08-31 10:18:33 字數 2232 閱讀 3281

oracle中exists與in的使用方法

用not exists 代替not in

select * from tsp_product p where not exists(select '' from tsp_orderitem i where p.id=i.product_id)

select * from tsp_product p where id not in(select product_id from tsp_orderitem i where p.id=i.product_id)

用exists 代替in

select * from tsp_product p where p.id in(select product_id from tsp_orderitem )

select * from tsp_product p where exists(select 'x' from tsp_orderitem i where p.id =i.product_id )

下面來分析為什麼用用not exists 代替not in

有兩個簡單例子,以說明 「exists」和「in」的效率問題

1) select * from t1 where exists(select 1 from t2 where t1.a=t2.a) ;

t1資料量小而t2資料量非常大時,t1<>t2 時,2) 的查詢效率高。

union

把兩張表的資料合起來,如有重複行,只取一行

union all

把兩張表的資料合起來,不過濾重複行

minus

返回在第乙個查詢結果中與第二個查詢結果不相同的那部分行記錄。 

oracle有這樣的一些約定

1.select語句必須返回相同的列數,如果列數不同的話,可以選擇串代替列。

2.select語句中相應的列必須有相同的資料型別,長度可以不同

rollup

統計:select sum(s.totalamount),to_char(createdate,'yyyy-mm') from tsp_orders s group by rollup(to_char(createdate,'yyyy-mm')

connect by

select level,a. * from tsp_area a start with parent_id is null connect by prior id = parent_id

說明:建立類似樹報表。

prior 強制報表的順序變為從根到葉(如果prior是父輩)或從葉到根(如果prior是後代)

雖然where子句可以人樹排除上體,但無法排除他們的子孫子(或者祖先,如果prior在等號的右邊)

詳細看看它他的區別

exists 用法:

請注意 1)句中的有顏色字型的部分 ,理解其含義;

其中 「select 1 from t2 where t1.a=t2.a」 相當於乙個關聯表查詢,相當於

「select 1 from t1,t2 where t1.a=t2.a」

但是,如果你噹噹執行 1) 句括號裡的語句,是會報語法錯誤的,這也是使用exists需要注意的地方。

「exists(***)」就表示括號裡的語句能不能查出記錄,它要查的記錄是否存在。

因此「select 1」這裡的 「1」其實是無關緊要的,www.3ppt.com換成「*」也沒問題,它只在乎括號裡的資料能不能查詢出來,是否存在這樣的記錄,如果存在,這 1) 句的where 條件成立。

in 的用法:

繼續引用上面的例子

「2) select * from t1 where t1.a in (select t2.a from t2) 」

這裡的「in」後面括號裡的語句搜尋出來的字段的內容一定要相對應,一般來說,t1和t2這兩個表的a欄位表達的意義應該是一樣的,否則這樣查沒什麼意義。

打個比方:t1,t2表都有乙個字段,表示工單號,但是t1表示工單號的欄位名叫「ticketid」,t2則為「id」,但是其表達的意義是一樣的,而且資料格式也是一樣的。這時,用 2)的寫法就可以這樣:

「select * from t1 where t1.ticketid in (select t2.id from t2) 」

select name from employee where name not in (select name from student);

select name from employee where not exists (select name from student);

Oracle中exists與in區別

in 與 exist 的語法比較 select from 資料表 t where t.x in 括號內可以是符合t.x欄位型別的值集合,如 1 2 3 但如果t.x是number型別的時候,似乎這樣的寫法會出問題 也可以是通過另外的select語句查詢出來的值集合,如 select y from 資...

oracle中in與exists的區別

exists是用來判斷是否存在的,當exists中的查詢存在結果時則返回真,否則返回假。not exists則相反。exists做為where 條件時,是先對where 前的主查詢詢進行查詢,然後用主查詢的結果乙個乙個的代入exists的查詢進行判斷,如果為真則輸出當前這一條主查詢的結果,否則不輸出...

Oracle中exists與in的區別

有兩個簡單例子,以說明 exists 和 in 的效率問題 1 select from t1 whereexists select 1 from t2 where t1.a t2.a t1資料量小而t2資料量非常大時,t1 2 select from t1 where t1.a in select ...