日期:2014-05-16  浏览次数:20568 次

(转载)在oracle的子查询中使用some,any和all
引用:http://blog.sina.com.cn/s/blog_4fd11d0a01009zeh.html###

用some,any和all对子查询中返回的多行结果进行处理。下面我们来简单介一下这几个关键词的含义。

    * Some在此表示满足其中一个的意义,是用or串起来的比较从句。
    * Any也表示满足其中一个的意义,也是用or串起来的比较从句,区别是any一般用在非“=”的比较关系中,这也很好理解,英文中的否定句中使用any肯定句中使用sone,这一点是一样的。
    * All则表示满足其其中所有的查询结果的含义,使用and串起来的比较从句。

下面是一些例子
找出员工中,只要比部门号为10的员工中的任何一个员工的工资高的员工的姓名个工资。也就是说只要比部门号为10的员工中的那个工资最少的员工的工资高就满足条件。

select ename,sal
From emp
Where sal > any(select sal from emp where deptno = 10);

这里推荐用any,如果你非要用some也是没有任何问题的,结果是一样的,只是一般来讲some用在“=”的比较从句中。
select ename,sal
From emp
Where sal > some(select sal from emp where deptno = 10);

上面的用法完全OK的。
select ename,sal
From emp
Where sal = some(select sal from emp where deptno = 30) and deptno not in (select deptno from emp where deptno = 30);

上面才是some的正常用法。其含义是找到和30部门员工的任何一个人工资相同的那些员工。虽然没有找到。
最后一个关键字all的用法也很简单就是要与子查询的每一结果都要匹配。

select ename,sal
From emp
Where sal > all(select sal from emp where deptno = 20);

上面的SQL语句的意义与前面的就完全不一样了,其意义是找到比部门号为20的员工的所有员工的工资都要高的员工,也就是比那个工资最高的员工的还要高的员工
总的来说some和any用法意义是一样的,仅在词法上有不同,都表示对子查询结果集中“或”的比较关系,而all则是对子查询结果集总每一个结果“与” 的关系
1 楼 caowei3047 2010-04-21  
发帖测试可真烦琐。
这三个关键字some,any和all,我还在真没有用过.
刚才专门在数据库里进行了简单的测试,发现some和any的效率要比直接用in,and,or稍微差一些,这些多出来的的时间应该是Oracle语法分析消耗掉的时间。这两个关键字似乎只是一种外围包装,最终还是要转化成那些常用的基本关键字去处理的。10g支持这些关键字,估计是为了降低SQL的门槛而出来的,只要SQL还能凑合,不建议使用。
至于all这个关键字,我极力反对使用它,如sal > all(select sal from emp where deptno = 20)这种判断,使用max函数要好很多。
我测试的结果,oracle对这3个关键字的解析并没有进行太多的优化,一般不要使用的好。

部分测试用例:
select * from table where created > some('20100420','20100421','201004222');
used:9.264s,
select * from table where created > some('20100420');
used:5.746s
oracle完全有能力将这两个查询的时间将为一致的时间,但他们没做。