Oracle中IN与EXISTS的对比分析
2008-03-19 18:38
253 查看
在Oracle中,经常会被到底用EXISTS还是用IN而困惑,下面简单说明 “exists”和“in”的区别
先看两个例子:
1) select * from T1 where exists(select 1 from T2 where T1.a=T2.a) ;
T1数据量小而T2数据量非常大时,T1<<T2 时,1) 的查询效率高。
2) select * from T1 where T1.a in (select T2.a from T2) ;
T1数据量非常大而T2数据量小时,T1>>T2 时,2) 的查询效率高。
exists 用法:
1)中“select 1 from T2 where T1.a=T2.a” 是一个关联表查询,相当于
“select 1 from T1,T2 where T1.a=T2.a”
“exists(xxx)”就表示括号里的语句能不能查出记录,它要查的记录是否存在。
因此“select 1”这里的 “1”其实是无关紧要的,换成“*”也没问题,它只在乎括号里的数据能不能查找出来,是否存在这样的记录,如果存在,这 1) 句的where 条件成立。
in 的用法:
2)中 “select * from T1 where T1.a in (select T2.a from T2) ”
这里的“in”后面括号里的语句搜索出来的字段的内容一定要相对应,就是说,T1和T2这两个表的a字段表达的意义应该是一样的。
先看两个例子:
1) select * from T1 where exists(select 1 from T2 where T1.a=T2.a) ;
T1数据量小而T2数据量非常大时,T1<<T2 时,1) 的查询效率高。
2) select * from T1 where T1.a in (select T2.a from T2) ;
T1数据量非常大而T2数据量小时,T1>>T2 时,2) 的查询效率高。
exists 用法:
1)中“select 1 from T2 where T1.a=T2.a” 是一个关联表查询,相当于
“select 1 from T1,T2 where T1.a=T2.a”
“exists(xxx)”就表示括号里的语句能不能查出记录,它要查的记录是否存在。
因此“select 1”这里的 “1”其实是无关紧要的,换成“*”也没问题,它只在乎括号里的数据能不能查找出来,是否存在这样的记录,如果存在,这 1) 句的where 条件成立。
in 的用法:
2)中 “select * from T1 where T1.a in (select T2.a from T2) ”
这里的“in”后面括号里的语句搜索出来的字段的内容一定要相对应,就是说,T1和T2这两个表的a字段表达的意义应该是一样的。
相关文章推荐
- MySQL查询语句中的IN 和Exists 对比分析
- 对比4个函数 isset in_array array_search array_key_exists 速率对比及初步分析原因
- mysql中exists和in的对比分析
- List<T>中对比Contains, Exists, Any之间的优缺点
- Week2 Teamework from Z.XML 软件分析与用户需求调查(五)从对比中看见必应助手发展空间
- ARM与MIPS平台优劣对比分析
- 业界主流需求管理工具对比分析
- JS几种数组遍历方式以及性能分析对比
- Android recovery.img与boot.img简单对比分析
- Android开发中onClick事件的几种实现,分析,对比
- EXISTS、IN、NOT EXISTS、NOT IN的区别与性能分析
- Oracle In和exists not in和not exists的比较分析
- 留学日本与留学欧美的对比分析
- JavaScript 几种数组遍历方式以及性能分析对比
- (钟豪原创)C#与C++类的继承机制的对比分析(1)
- AVR、51系列、PIC单片机的对比分析
- 三种强大的物体识别算法——SIFT/SURF、haar特征、广义hough变换的特性对比分析
- GitHub & Bitbucket & GitLab & Coding 的对比分析
- 另一种Atlas Scripts Intellisense的方法以及对比与分析(转载)
- Memcache,Redis,MongoDB(数据缓存系统)方案对比与分析