6,Exists, not exsists,in ,not in
先来描述一下oracle的连接和子查询,在很多情况下,连接和子查询可以相互替代,这时候如何选择使用很多是凭个人习惯,不过二者在执行的效率问题上面确并不是完全一样的,往往需要根据具体的数据量的大小结合执行计划来调整。
in和exists同样可以相互替代,也需要根据具体的情况来选择使用。使用in的情况下,oracle有限查询子查询,然后匹配外层查询,exists则刚好相反。
一般来说,后面的子查询结果集如果比较小的话,一般使用in,如果子查询较大,而外层的查询相对较小,则使用exists。
Not in 和not exists则不能完全替换,他们有一些差异。具体先看一个例子:
SQL> select * from t_test_chr a ;
TYPE TYPE_VARCHAR2 TYPE_NVARCHAR2
---- -------------------- --------------------
1111 1111 1111
1
SQL> select * from t_test_chr a where not exists (select 1 from t_test_chr where type_varchar2 = a.type_varchar2 );
TYPE TYPE_VARCHAR2 TYPE_NVARCHAR2
---- -------------------- --------------------
1
SQL> select * from t_test_chr a where type_varchar2 not in (select type_varchar2 from t_test_chr);
no rows selected
而exists 和in分别的结果是:
SQL> select * from t_test_chr a where exists (select 1 from t_test_chr where type_varchar2 = a.type_varchar2 );
TYPE TYPE_VARCHAR2 TYPE_NVARCHAR2
---- -------------------- --------------------
1111 1111 1111
SQL> select * from t_test_chr a where type_varchar2 in (select type_varchar2 from t_test_chr);
TYPE TYPE_VARCHAR2 TYPE_NVARCHAR2
---- -------------------- --------------------
1111 1111 1111
这样区别就一目了然了。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/16179598/viewspace-662801/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/16179598/viewspace-662801/