orcale exists

原创 2007年09月18日 16:08:00
在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.

关于Oracle中in和exists的区别

1、关于在 Oracle8i  时代中in和exists的区别   这里有条SQL语句:select * from A where id in(select id from B)  以上查询使...
  • okh258
  • okh258
  • 2015年12月17日 16:55
  • 2761

详解not in与not exists的区别与用法(not in的性能并不差!)

在网上搜了下关于oracle中not exists和not in性能的比较,发现没有描述的太全面的,可能是问题太简单了,达人们都不屑于解释吧。于是自己花了点时间,试图把这个问题简单描述清楚,其实归根结...
  • johnjobs
  • johnjobs
  • 2013年09月29日 17:06
  • 2161

SQL中exists关键字的用法

exists用于检查一个子查询是否至少会返回一行数据(即检测行的存在),返回值为true或false。     语法: exists subquery     参数: subquery 是一个受限的 ...
  • wangshuxuncom
  • wangshuxuncom
  • 2013年11月05日 17:11
  • 8465

【SQL】IN、EXISTS和表连接三者的效率比较

一、 IN和EXISTS比较 在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行查询。此时就会用到IN和EXISTS。 例如:查询departments表中存在的部门的人数。 1、 ...
  • NextAction
  • NextAction
  • 2017年04月27日 14:00
  • 1492

SQL语句中exists/not exists的用法分析

1、Student: Sno Sname Ssex Sage Sdept 200215121 李勇 男 20 CS 200215122 刘晨...
  • wozengcong
  • wozengcong
  • 2015年05月18日 13:20
  • 20622

hibernate用hql写exists语句,多表关联,中间表无实体类。

之前一直用mybatis,最近接触一个项目用的hibernate,hibernate新手,说句不好听的话:特么蛋疼!好难用啊有木有!好难用啊有木有!好难用啊有木有!重要的话说三遍。 因为distin...
  • Ragin
  • Ragin
  • 2015年09月09日 16:11
  • 6395

Mysql实现数据的不重复写入(insert if not exists)以及新问题:ID自增不连续的解答

最近做数据处理时候,遇到一个问题。用一个id自增主键时候,数据表中会插入大量重复数据(除ID不同)。这虽然对最终数据处理结果没有影响,但是有1个问题,如果数据量超大,对处理的速度影响成几何倍数增长!所...
  • liyong199012
  • liyong199012
  • 2014年03月19日 10:37
  • 25650

sql语句中exists和in用法的区分

初学java两个多月,这两天在整理老师的笔记对数据库中的exists和in的用法分不清楚,从网上搜了些资料,作了点总结。 一、问题起因 起初是由两条语句执行结果不同,语句如下: --分析以下结果...
  • U___U
  • U___U
  • 2015年03月27日 15:25
  • 4238

EXISTS、IN与JOIN性能分析

EXISTS、IN与JOIN,都可以用来实现形如“查询A表中在(或不在)B表中的记录”的查询逻辑。 在论坛上看到很多人对此有所误解(如关于in的疑惑、用 外连接 和 Is Null 代替 not i...
  • caomiao2006
  • caomiao2006
  • 2016年08月03日 00:19
  • 2658

MySQL NOT EXISTS优化的一个案例

exists是对外表作loop循环,每次loop循环再对内表进行查询,在项目中遇到类似的问题,数据量大时,not exists不管用并且执行SQL的时间很长,在网上查了一些资料,所以记录下来: 原始S...
  • qq496013218
  • qq496013218
  • 2017年02月14日 09:25
  • 300
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:orcale exists
举报原因:
原因补充:

(最多只允许输入30个字)