在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用户下
执行
SQL> select count(*) from emp where empno not in ( select mgr from emp );
COUNT(*)
----------
? ?? ???0
SQL> 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 的差异
热度:54 发布时间:2016-05-05 13:25:10.0
相关解决方案
- oracle 分页排序,ssi,该怎么处理
- oracle 最近的时间(而不是前一天的时间) 跪求sql语句 。解决方法
- oracle,该怎么解决
- oracle 安装时出现 java tm 异常
- android访问其他数据库(如:oracle、MySql等),希望大家给点建议!解决方案
- oracle 安插 LONG VARCHAR 类型数据
- oracle loadjava如何用
- oracle,该如何处理
- C# + SQL server +oracle QQ交流群142703980解决方法
- VS10连接Oracle的有关问题:"Oracle.DataAccess.Client.OracleConnection"的类型初始值设定项引发错误
- Oracle-参数查询有关问题
- oracle,insert 语句插入一条记录后要求,返回主键id値。解决思路
- Oracle 10g下的SQL语句,有点难度.请~[同时向朋友们道歉~]
- 月统计(oracle)解决办法
- 在线紧急等一sql语句(oracle),该怎么处理
- 有关File.Exists(filename)的有关问题
- oracle 连接数据库该如何写语句的
- oracle 客户端链接服务端的方式?该如何解决
- Oracle select后表的最左首的数字
- Oracle 服务器字符集和pl/sql字符集有关问题,
- Oracle DBA解决方案
- oracle 中表名的连接解决方法
- oracle 老鸟进,新人求指点解决方法
- oracle 恢复删除的表,该怎么解决
- oracle 数据自动增长,该怎么解决
- 求推荐数据库脚本编纂的书籍(oracle)
- oracle 数据库,该如何解决
- oracle 用室外部验证
- 高分寻 oracle 锁机制 并行安插表数据数量的控制方法
- oracle 中表名的联接