比較Oracle SQL中的IN EXISTS

2021-05-22 13:07:15 字數 2910 閱讀 5567

在oracle sql中取資料時有時要用到in 和 exists 那麼他們有什麼區別呢?

1 效能上的比較

比如select * from t1 where x in ( select y from t2 )

執行的過程相當於:

select *

from t1, ( select distinct y from t2 ) t2

where t1.x = t2.y;

相對的select * from t1 where exists ( select null from t2 where y = x )

執行的過程相當於:

for x in ( select * from t1 )

loop

if ( exists ( select null from t2 where y = x.x )

then

output the record

end if

end loop

表 t1 不可避免的要被完全掃瞄一遍

分別適用在什麼情況?

以子查詢 ( select y from t2 )為考慮方向

如果子查詢的結果集很大需要消耗很多時間,但是t1比較小執行( select null from t2 where y = x.x )非常快,那麼exists就比較適合用在這裡

相對應得子查詢的結果集比較小的時候就應該使用in.

2 含義上的比較

在標準的scott/tiger使用者下

empno

ename

job

mgr

hiredate

sal

comm

deptno

17499

allen

salesman

7698

1981/02/20

1600.00

300.00302

7521

ward

salesman

7698

1981/02/22

1250.00

500.00303

7566

jones

manager

7839

1981/04/02

2975.00204

7654

martin

salesman

7698

1981/09/28

1250.00

1400.00305

7698

blake

manager

7839

1981/05/01

2850.00306

7782

clark

manager

7839

1981/06/09

2450.00107

7788

scott

analyst

7566

1987/04/19

3000.00208

7839

king

president

1981/11/17

5000.00109

7844

turner

salesman

7698

1981/09/08

1500.00

0.00

3010

7876

adams

clerk

7788

1987/05/23

1100.00

2011

7900

james

clerk

7698

1981/12/03

950.00

3012

7902

ford

analyst

7566

1981/12/03

3000.00

2013

7934

miller

clerk

7782

1982/01/23

1300.00

10執行

sql> select count(*) from emp where empno not in ( select mgr from emp );

count(*)

----------

0sql> select count(*) from emp t1

2  where not exists ( select null from emp t2 where t2.mgr = t1.empno ); -- 這裡子查詢中取出null並沒有什麼特殊作用,只是表示取什麼都一樣。

count(*)

----------

8結果明顯不同,問題就出在mgr=null的那條資料上。任何值x not in (null)  結果都不成立。

用乙個小例子試驗一下:

select * from dual where dummy not in ( null ) -- no rows selected

select * from dual where not( dummy not in ( null ) ) --no rows selected

知覺上這兩句sql總有一句會取出資料的,但是實際上都沒有。sql中邏輯表示式的值可以有三種結果(true false null)而null相當於false.

Oracle SQL中IN與EXISTS的比較

在oracle sql中取資料時有時要用到in 和 exists 那麼他們有什麼區別呢?1 效能上的比較 比如select from t1 where x in select y from t2 執行的過程相當於 select from t1,select distinct y from t2 t2...

Oracle sql語法中decode函式的用法

decode 條件,值1,結果1,值2,結果2,值3,結果3,值n,結果n,預設值 改函式的解釋 if 條件 值1 then return 結果1 elsif 條件 值2 then return 結果2 elsif 條件 值n then return 結果n else return 預設值 end ...

oracle sql 中不同型別的表連線

1 full join 2 inner join 3 outer join left outer join right outer join full join 匹配的結果與所有左邊的表中不匹配右邊的行和右邊的表中所有不匹配左邊的行加在一起,在不匹配的地方使用null代替。結果行數 匹配行數 左表剩...