oracle中in和exist的区别

 我来答
六六看社会
高粉答主

2018-04-11 · 财务助理
六六看社会
采纳数:2198 获赞数:126526

向TA提问 私信TA
展开全部

in和exist的主要区别体现在对sql执行计划的影响上。

传统上认为,如果子查询的条件更具选择性(selective),就用in;而如果父查询(外层查询)的条件更具选择性(selective),就用exist。

具体的内容可以参考以下oracle原厂的手册,oracle的原厂手册都是英文版的。

另外需要特别注意的是,in和exist的区别只在10.2.0.3及以前的版本中存在;而10.2.0.4及以后的版本中,in和exist的效果是完全一样的,手册中也删除了有关二者区别的说明。

以下是对手册的引用:

In certain circumstances, it is better to use IN rather than EXISTS. In general, if the selective predicate is in the subquery, then use IN. If the selective predicate is in the parent query, then use EXISTS.

Sometimes, Oracle can rewrite a subquery when used with an IN clause to take advantage of selectivity specified in the subquery. This is most beneficial when the most selective filter appears in the subquery and there are indexes on the join columns. Conversely, using EXISTS is beneficial when the most selective filter is in the parent query. This allows the selective predicates in the parent query to be applied before filtering the rows against the EXISTS criteria.

shenjun134
推荐于2018-02-27 · TA获得超过372个赞
知道小有建树答主
回答量:136
采纳率:50%
帮助的人:156万
展开全部
in 和 exists区别

in 是把外表和内表作hash join,而exists是对外表作loop,每次loop再对内表进行查询。

一直以来认为exists比in效率高的说法是不准确的。
如果查询的两个表大小相当,那么用in和exists差别不大。

如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in:

例如:表A(小表),表B(大表)
1:
select * from A where cc in (select cc from B)
效率低,用到了A表上cc列的索引;
select * from A where exists(select cc from B where cc=A.cc)
效率高,用到了B表上cc列的索引。
相反的
2:
select * from B where cc in (select cc from A)
效率高,用到了B表上cc列的索引;
select * from B where exists(select cc from A where cc=B.cc)
效率低,用到了A表上cc列的索引。
带in的关联子查询是多余的,因为in子句和子查询中相关的操作的功能是一样的。如:
select staff_name from staff_member where staff_id in
(select staff_id from staff_func where staff_member.staff_id=staff_func.staff_id);

为非关联子查询指定exists子句是不适当的,因为这样会产生笛卡乘积。如:
select staff_name from staff_member where staff_id
exists (select staff_id from staff_func);

not in 和not exists

如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;
而not extsts 的子查询依然能用到表上的索引。
所以无论哪个表大,用not exists都比not in要快。

尽量不要使用not in子句。使用minus 子句都比not in 子句快,虽然使用minus子句要进行两次查询:
select staff_name from staff_member where staff_id in (select staff_id from staff_member minus select staff_id from staff_func where func_id like '81%');

in 与 "=" 的区别

select name from student where name in ('zhang','wang','li','zhao');



select name from student where name='zhang' or name='li' or name='wang' or name='zhao'

的结果是相同的。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
qfwu
2010-12-22 · TA获得超过581个赞
知道小有建树答主
回答量:481
采纳率:0%
帮助的人:349万
展开全部
在SQL中,简单的说exist判断查询结果是否为空集,而in是两个集合之间的包含关系。比如name in ('zhang','wang','li','zhao');
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
loveyurui
2010-12-22 · TA获得超过6556个赞
知道大有可为答主
回答量:2892
采纳率:33%
帮助的人:982万
展开全部
刚刚总结了下。不仅仅是判断是否为空集的原因:
http://hi.baidu.com/loveyurui/blog/item/07106d836e72e2c9bd3e1e58.html
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式