• Oracle子查询中any、some、all之间的区别


    用some,any和all对子查询中返回的多行结果进行处理。

    下面我们来简单介一下这几个关键词的含义。   

    * Some在此表示满足其中一个的意义,是用or串起来的比较从句。

    * Any也表示满足其中一个的意义,也是用or串起来的比较从句,区别是any一般用在非“=”的比较关系中,这也很好理解,英文中的否定句中使用any肯定句中使用some,这一点是一样的。

    * All则表示满足其其中所有的查询结果的含义,使用and串起来的比较从句。

    Any

    带【any】的嵌套查询和【some】的嵌套查询功能是一样的。早期的SQL仅仅允许使用【any】,后来的版本为了和英语的【any】相区分,引入了【some】,同时还保留了【any】关键词。

    any:

    select emp.empno,emp.ename,emp.job,emp.sal from scott.emp where sal >any(select sal from scott.emp where     job='MANAGER');

    带any的查询过程等价于两步的执行过程。

        (1)执行“select sal from scott.emp where job='MANAGER'”

     select emp.empno,emp.ename,emp.job,emp.sal from scott.emp where sal >2975 or sal>2850 or sal>2450;

     

    some

    some:

    select emp.empno,emp.ename,emp.job,emp.sal from scott.emp where sal =some(select sal from scott.emp where     job='MANAGER');

     

     带some的嵌套查询与any的步骤相同。

        (1)子查询,执行“select sal from scott.emp where job='MANAGER'”,其结果如图4.22所示。

        (2)父查询执行下列语句。

        ―――――――――――――――――――――――――――――――――――――

        select emp.empno,emp.ename,emp.job,emp.sal from scott.emp where sal =2975 or sal=2850 or sal=2450;

    all

    all 是查询还可以是子查询

    如:

     

    select name from edit

    其中name前省略了all.

    name前可以加ALL|DISTINCT

    all是所有记录.

    distinct是不重复的。

    因为很少用到, 所以几乎忘记了这几个函数, 不过它们还是很有用的使用它们可以大大简化一些SQL文的语法, 至于效率问题, 
    如CCW所说它们和EXISTS, IN 之类没有什么差别, 而且要具体问题具体分析
    其中ANY和SOME在意思上是相同的, 
    可以相互替代.
    举几个例子来说明ALL和ANY的用法
    1. SELECT * FROM TABLEA WHERE FLD > ALL(SELECT FLD FROM TABLEA)
    这相当于
    SELECT * FROM TABLEA WHERE FLD > (SELECT MAX(FLD) FROM TABLEA)

    2. SELECT * FROM TABLEA WHERE FLD > ANY(SELECT FLD FROM TABLEA)
    这相当于
    SELECT * FROM TABLEA WHERE FLD > (SELECT MIN(FLD) FROM TABLEA)

    3. SELECT * FROM TABLEA WHERE FLD = ANY(SELECT FLD FROM TABLEA)
    这相当于
    SELECT * FROM TABLEA WHERE FLD IN (SELECT FLD FROM TABLEA)

    最后, 关于HAVING它是用于合计计算的运算符, 它和WHERE有着不同的含义
    当使用GROUP时HAVING是对各组中的记录进行比较的意思, 
    换句话说它是选择一组数据的条件
    而WHERE则和分组无关, 它是选择一行数据的条件
    比如, 
    SELECT NAME, AVG(PRICE) FROM STORE GROUP BY NAME HAVING AVG(PRICE) > 10
    这里的HAVING是WHERE无法替代的
    至于效率, WHERE是在生成结果集之前就完成的处理, 
    而HAVING则要等到结果集做成后在循环执行的处理, 自然效率要低一些, 因此在只需要对行进行操作的时候, 不要使用HAVING。

     
  • 相关阅读:
    程序猿和产品狗
    编写一个友元函数,求两个日期之间相差的天数
    集合的模拟实现(类模板)
    友元很简单2016final
    攻防世界-parallel-comparator-200
    web-GXYCTF2019 StrongestMind
    破解010Editor
    2020第三届江西省高校网络安全技能大赛线下解题赛部分wp
    pwn-EasyHeap(House of spirit)
    web-2020 ciscn littlegame(原型链污染)
  • 原文地址:https://www.cnblogs.com/ymf123/p/4915734.html
Copyright © 2020-2023  润新知