Exists用于只能用于子查询,可以替代in,若匹配到结果,则退出内部
查询,并将条件标志为true,传回全部结果资料,in不管匹配到匹配不到都
全部匹配完毕,使用exists可以将子查询结果定为常量,不影响查询效果,
而且效率高。如查询所有销售部门员工的姓名,对比如下:
IN is often better if the results of the subquery are very small
When you write a query using the IN clause, you're telling the rule-based optimizer that you
want the inner query to drive the outer query.
When you write EXISTS in a where clause, you're telling the optimizer that you want the outer
query to be run first, using each value to fetch a value from the inner query.
In many cases, EXISTS is better because it requires you to specify a join condition, which can
invoke an INDEX scan. However, IN is often better if the results of the subquery are very
small. You usually want to run the query that returns the smaller set of results first.
若子查询结果集比较小,优先使用in,若外层查询比子查询小,优先使
用exists。因为若用in,则oracle会优先查询子查询,然后匹配外层查询,
若使用exists,则oracle会优先查询外层表,然后再与内层表匹配。最优化
匹配原则,拿最小记录匹配大记录。
在看下官网文档里怎么说:
首先看下语法,语法很简单,一看例子大家都会明白,但一定要注意Operation里面的那句话很重要,因为这样关系到null的问题,是返回至少一行就返回true值。
与exists 含义相反,也在子查询中使用,取出不满足条件的,与not in有一
定的区别,注意有时候not exists不能完全替代not in
可以看下面的例子,注意not in的检索是从外部查询逐条匹配子查询的检索出所有的元素。匹配相等就返回true,就会输出一条元素。而not exists就不是这个搜索原理了,他是看返回的元素个数如果针对not exists返回的元素为0则为真,所以会保留Null值。
可以看下以下的例子: