`
layznet
  • 浏览: 226421 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

(转载)在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完全有能力将这两个查询的时间将为一致的时间,但他们没做。

相关推荐

    Oracle 子查询

    Oracle子查询是构建复杂查询的基石,通过合理利用单行或多行子查询,结合`IN`、`ANY`、`SOME`、`ALL`、`EXISTS`等关键字,可以极大地提高查询的灵活性和效率。理解并熟练掌握子查询的使用,对于提升数据库操作技能和...

    oracle子查询PPT课件.ppt

    Oracle子查询是指在SQL语句中嵌套使用SELECT语句,以解决复杂的查询问题。下面是Oracle子查询的知识点总结: 一、子查询的定义和类型 * 子查询是一个完整的SELECT语句,嵌套在另一个SELECT语句中。 * 子查询可以...

    《Pro Oracle SQL》CHAPTER2--2.8 Subquery Unnesting

    - **集合子查询**:返回多行数据,可以与ANY、ALL或SOME操作符结合使用。 - **相关子查询**:依赖于外部查询的值进行计算。 3. **子查询展开**(Subquery Unnesting): 这是一种查询优化技术,Oracle会尝试将子...

    select子查询1

    - `ANY` 或 `SOME`:用于检查一个值是否大于或等于子查询返回的任何值,如`SELECT * FROM EMP WHERE SAL < ANY (SELECT SAL FROM EMP WHERE DEPTNO=20)`。 - `ALL`:用于检查一个值是否小于或等于子查询返回的所有...

    《Pro Oracle SQL》Chapter 10 Subquery Factoring --10.1 Standard Usage

    在提供的文件列表中,我们可以看到“10-1RESULT.sql”,这可能是一个示例查询的结果,展示如何在实际环境中使用子查询。而“PIVOT_TEST.sql”和“PIVOT_DATA.sql”可能涉及到Oracle的Pivot功能,这是将行转换为列的...

    Oracle教程.docx

    * ANY、SOME 和 ALL:将值与列表或子查询进行比较 7. 设置操作符 * UNION:合并两个或多个独立查询的结果 * INTERSECT:实现两个独立查询的结果的交集 * MINUS:从一个结果集中减去另一个结果(也就是求差集) ...

    Oracle Sql基础 Oracle Sql基础 Oracle Sql基础

    - 多行子查询返回多个值,可以使用IN、ANY/SOME、ALL等操作符与之配合使用。 #### 七、操纵数据 **7.1 学习目的** - 本章主要讲解如何使用数据操纵语言(DML)来进行数据的插入、更新和删除等操作。 **7.2 数据...

    Oracle11g SQL基础-实验手册.pdf

    ANY/SOME、ALL关键字的使用也在此章节中被涵盖,它们是处理子查询结果时常用的比较操作。 第7章iSQL*Plus介绍了iSQL*Plus的基本操作,包括启动与关闭、默认访问地址、定义常量与绑定变量、以及SET命令的使用。 第8...

    Oracle数据库整理学习手册

    - **多行子查询**:当子查询返回多行结果时,可以使用关键字ANY/SOME 或 ALL 进行比较。 - **分组查询**:通过GROUP BY对数据进行分组,然后结合聚合函数如COUNT、SUM等进行统计分析。 - **HAVING 子句**:与WHERE...

    Oracle11g SQL基础-实验手册

    本章节讲解了如何向表中插入数据,从另一个表复制数据,更新表中数据,使用子查询更新多列,删除表中数据,执行基于另一个表的删除操作,以及使用INSERT ALL、MERGE等语句进行复杂的插入操作。还提到了使用DEFAULT值...

    第9章 Oracle数据的复杂查询.ppt

    - **9.1.5 使用SOME的子查询**:与ANY类似,但只需满足内层查询结果中的任意一个值即可。 - **9.1.6 使用EXISTS的嵌套查询**:当内层查询返回非空结果时,外层查询才执行。通常在WHERE子句中使用。 **9.2 多表内...

    oracle函数详解[收集].pdf

    在描述中提到的符号和操作符,例如`+`、`-`、`*`、`/`用于基本的数学运算,`IS NULL`和`IS NOT NULL`用于检查值是否存在,`BETWEEN`、`NOT BETWEEN`用于区间判断,`IN`、`NOT IN`、`ANY`、`SOME`、`ALL`用于集合比较...

    Oracle中的优化器如何进行评估优化

    对于子查询中的ALL操作符,优化器会使用"NOT EXISTS"和"ANY"的组合进行替换。 6. **BETWEEN操作符**:优化器会将BETWEEN操作符转换为两个边界比较,如`sal BETWEEN 2000 AND 3000`等同于`sal >= 2000 AND sal ,这...

    oracle练习_面试题

    ANY 和 SOME 函数可以用来比较子查询结果,ALL 函数可以用来比较子查询结果的所有值。 示例: ```sql SELECT * FROM TABLEA WHERE FLD > ALL (SELECT FLD FROM TABLEA); SELECT * FROM TABLEA WHERE FLD > ANY...

    Oracle 函数大全

    - 集合比较:`ANY`, `SOME`和`ALL`与比较运算符结合,用于与一组值进行比较。 - 模式匹配:`LIKE`用于字符串的模糊匹配,`NOT LIKE`则表示不匹配。 2. 简单SELECT查询: - SELECT语句用于从表中选取特定列的数据...

    Oracle --PlSql教程

    - 子查询可以在WHERE子句中使用外部查询的列。 - **EXISTS、ANY、ALL的使用:** - EXISTS用于检查子查询是否至少返回一行数据。 - ANY、ALL用于比较一个值与子查询结果集合中的所有值。 #### 九、操作数据 - **...

    Oracle教程

    - **比较操作符和集合操作符**: 如IN、ANY/SOME、ALL等。 #### 八、高级查询 高级查询包括复杂的查询操作,如窗口函数、集合操作等。 - **窗口函数**: 如ROW_NUMBER()、RANK()、DENSE_RANK()等,用于在结果集中的...

    oracle函数详解

    - 这里 `sal <= ANY` 表示 `sal` 小于或等于子查询结果中的任意一个值。 #### 5. ALL 运算符 ALL 运算符用于比较一个值与另一个子查询返回的所有值: - 示例:`SELECT name, sal FROM emp WHERE sal <= ALL (500, ...

    SQL优化(oracle)

    - **ANY和SOME操作符优化**:对于`ANY`和`SOME`操作符,优化器会将这些转换为使用等价的`=`和`OR`或`EXISTS`子查询的表达式。 - 示例:`sal > ANY(:first_sal, :second_sal)` 转换为 `sal > :first_sal OR sal > :...

Global site tag (gtag.js) - Google Analytics