oracle中IN,NOT IN,EXISTS,NOT EXISTS的用法和差别:
Exists:子查询至少返回一行时条件为true。
Not Exists:子查询不返回任何一行时条件为true。
In:与子查询返回结果集中某个值相等。
Not In:与子查询返回结果集中任何一个值不相等。
IN:
确定给定的值是否与子查询或列表中的值相匹配。
exists:
使用 EXISTS 和 NOT EXISTS 引入的子查询可用于两种集合原理的操作:交集与差集。
交集:包含同时属于两个原集合的所有元素。
差集:包含只属于两个集合中的第一个集合的元素。
exists 与in 的区别:
EXISTS:后面可以是整句的查询语句如:SELECT * FROM titles
IN:后面只能是对单列:SELECT pub_id FROM titles
以下说明 “exists”和“in”的效率问题
1) select * from T1 where exists(select 1 from T2 where T1.a=T2.a) ;
--
2) select * from T1 where T1.a in (select T2.a from T2) ;
--
not exists比not in速度快(在not exists子查询里的语句比较复杂时,有可能比not in慢),最好将not in 转化成not exists。另外,要注意的是,in或者not in里面都不能有null值,否则会得不到结果。
如果数据量很小的话,in和exists的差距是忽略不计的,但数据量很大时差距就很大了!in会在先执行一次后面的大表中的全表扫描,然后生成一个新的虚表再进行全表扫描,而exists只执行一次后面的大表的扫描,每次扫描为真时就返回,继续往下走!所以在数据量很大时这个效率的差距也是惊人的!
增加:
>ANY:比子查询返回结果中的某个值大。
=ANY:与子查询返回结果中的某个值相等。
<ANY:比子查询返回结果中的某个值小。
>ALL:比子查询返回结果中的所有值都大。
<ALL :比子查询返回结果中的所有值都小。