在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代替。結果行數 匹配行數 左表剩...