`

比较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
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
1 7499 ALLEN SALESMAN 7698 1981/02/20 1600.00 300.00 30
2 7521 WARD SALESMAN 7698 1981/02/22 1250.00 500.00 30
3 7566 JONES MANAGER 7839 1981/04/02 2975.00 20
4 7654 MARTIN SALESMAN 7698 1981/09/28 1250.00 1400.00 30
5 7698 BLAKE MANAGER 7839 1981/05/01 2850.00 30
6 7782 CLARK MANAGER 7839 1981/06/09 2450.00 10
7 7788 SCOTT ANALYST 7566 1987/04/19 3000.00 20
8 7839 KING PRESIDENT   1981/11/17 5000.00 10
9 7844 TURNER SALESMAN 7698 1981/09/08 1500.00 0.00 30
10 7876 ADAMS CLERK 7788 1987/05/23 1100.00 20
11 7900 JAMES CLERK 7698 1981/12/03 950.00 30
12 7902 FORD ANALYST 7566 1981/12/03 3000.00 20
13 7934 MILLER CLERK 7782 1982/01/23 1300.00   10

执行
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.
分享到:
评论

相关推荐

    sql in,exists,not in,not exists区别

    里面自己根据网上的资源整理出来的一份sql中in,exists,not in,not exists的使用方法以及注意事项等,有助于初学的朋友们借鉴。

    oracle advanced sql 高级SQL教程 ORACLE官方教材

    Using a Subquery in the FROM Clause 4-10 Scalar Subquery Expressions 4-11 Scalar Subqueries: Examples 4-12 Correlated Subqueries 4-14 Using Correlated Subqueries 4-16 Using the EXISTS Operator 4-18 ...

    ORACLE SQL性能优化技巧

    书写高质量的oracle sql,用表连接替换EXISTS,索引的技巧等等

    ORACLE SQL性能优化系列(全)

    非常全面的ORACLE SQL性能优化介绍及实例:优化器的选择、共享SQL语句、访问Table的方式、减少访问数据库的次数、使用DECODE函数、减少对表的查询、通过内部函数提高SQL效率、用NOT EXISTS替代NOT IN、使用EXPLAIN ...

    Oracle及SQL语句优化指南

    很适合开发人员在编写SQL时注意,这里虽然说是Oracle的优化,其实,很多是标准SQL需要注意的写法。具有非常高的共通性。 1.选用适合的ORACLE优化器 2.HERE子句中的连接顺序 ...4.EXISTS与IN的使用场景 5.索引造成的大错

    oracle的sql优化

     对Oracle共享池和缓冲区中的Sql必须要大小写都完全用上才能够匹配上 2.顺序问题  Oracle按照从右到左的顺序对数据表进行解析。因此From最后面的表为基础表,一般要选择记录数最少的表作为基础表。  对于Where...

    Oracle数据库SQL语句优化策略

    基本的Sql编写注意事项 尽量少用IN操作符,基本上所有的IN操作符都可以用EXISTS代替 用IN写出来的SQL的优点是比较容易写及清晰易懂,但是用IN的SQL性能总是比较低的,从ORACLE执行的步骤来分析用IN的SQL与不用IN的...

    SQL之EXISTS

    exists是用来判断是否存在的,当exists(查询)中的查询存在结果时则返回真,否则返回假。not exists则相反 它所在的查询属于相关子查询,即子查询的查询条件依赖于外层父查询的某个属性值,处理过程一般为: 取外层...

    Oracle高级sql学习与练习

    2、EXISTS和NOT EXISTS的使用 3、WITH字句 4、MERGE INFO 合并资料 5、层次查询(HIERARICAL RETRIVEL) 6、DECODE函数和行列互换 7、CASE表达式 8、ROWNUM-TOP-N分析 9、相关子查询和非相关子查询 10、增强GROUP BY...

    oracle sql performance tuning

    3.1 绝大多数情况下NOT EXISTS比NOT IN 效率高 6 3.2 UNION ALL效率比UNION高很多 6 3.3 一些很耗资源的SQL操作,在不必要的情况下不要使用 6 3.4 通常联接查询比子查询的效率要高很多 7 3.5 用TABLE 索引(INDEX)...

    oracle高级sql讲解课程

    with子句使用,集合操作,case应用,行列互换,4 exists与in、not exists与not in

    Oracle数据库、SQL

    12.7 in和exists比较 22 十三、 多表查询 23 13.1按范式要求设计表结构 23 13.2多表连接的种类 23 13.3交叉连接 23 13.4内连接 23 13.5外连接 25 13.6非等值连接 27 13.7表连接总结 27 十四、 集合 28 14.1表连接...

    oracle sql性能调优

    基于成本、规则调优,对sql语句中的一些语句的优化,例如在什么情况下用exists代替in、not exists代替not in等。

    Oracle In和exists not in和not exists的比较分析

    in和exist的区别 从sql编程角度来说,in直观,exists不直观多一个select, in可以用于各种子查询,而exists好像只用于关联子查询 从性能上来看 exists是用loop的方式,循环的次数影响大,外表要记录数少,内表就...

    Oracle SQL最佳实践

    1.用EXISTS代替DISTINCT,消除sort operation  2.如果在GROUP BY中过滤数据,在WHERE从句中指定条件比在HAVING从句中有更好的性能,因为在GROUP之前已经过滤掉数据,因此更少的行被汇总  3.UNION会对两个SELECT...

    Oracle-SQL基础到存储过程下载(第二阶段)

    016.sql高级查询_in操作.mp4 017.sql高级查询_between-and操作.mp4 018.sql高级查询_like模糊查询.mp4 019.sql高级查询_集合运算.mp4 020.sql高级查询_约束.mp4 021.sql高级查询_关联之通用写法001.mp4 022.sql高级...

    Oracle数据库Sql性能调优

    1.20 用NOT EXISTS替代NOT IN 12 1.21 用表连接替换EXISTS 13 1.22 用EXISTS替换DISTINCT 13 1.23 识别’低效执行’的SQL语句 14 1.24 用索引提高效率 14 1.25 索引的操作 15 1.26 多个平等的索引 16 1.27 等式比较...

    LECCO SQL Expert (智能自动SQL优化)

     从比较的结果可以看到,重写得到的SQL124把第一个Exists改写成了In;在字段DPT_ID上进行了合并空字符串的操作以诱导数据库先执行子查询中的(SELECTDPT_ID||'FROMDEPART-MENTWHEREDPT_NAMELIKE'AC%')在...

    oracle数据库学习笔记总结

    二、常用SQL: ... SQL Server的: IF EXISTS (SELECT name FROM sysobjects WHERE name = '表名' AND type = 'U') DROP TABLE 表名; Oracle的: create or replace table 表名 ...; -- 直接写建表语句

Global site tag (gtag.js) - Google Analytics