• [转]Oracle SOME,ANY,All,EXISTS,IN


    原文地址:http://blog.csdn.net/shangboerds/article/details/43983791

    -- Start

    这几个关键字有一个共同点,那就是它们一般应用于子查询中。大家对 IN 和 EXISTS 都比较熟悉,这里我就不介绍了,下面我们看一看如何使用其他几个关键字,首先,我们定义如下表:

    1. --学生  
    2. CREATE TABLE STUDENT    
    3. (    
    4. ID         VARCHAR2(8),  ---学号  
    5. NAME       VARCHAR2(20), ---姓名  
    6. CLASS      VARCHAR2(20), ---班级  
    7. CHINESE    NUMBER(5),    ---语文成绩  
    8. MATH       NUMBER(5)     ---数学成绩  
    9. );  
    10.    
    11. INSERT INTO STUDENT (ID, NAME, CLASS, CHINESE, MATH) VALUES ('20090001', '张三', '五年级A班', 80 ,90);  
    12. INSERT INTO STUDENT (ID, NAME, CLASS, CHINESE, MATH) VALUES ('20090002', '李四', '五年级A班', 60 ,75);  
    13. INSERT INTO STUDENT (ID, NAME, CLASS, CHINESE, MATH) VALUES ('20090003', '王五', '五年级A班', 90 ,95);  
    14. INSERT INTO STUDENT (ID, NAME, CLASS, CHINESE, MATH) VALUES ('20090004', '赵红', '五年级B班', 70 ,90);  
    15. INSERT INTO STUDENT (ID, NAME, CLASS, CHINESE, MATH) VALUES ('20090004', '李白', '五年级B班', 85 ,80);  
    16. INSERT INTO STUDENT (ID, NAME, CLASS, CHINESE, MATH) VALUES ('20090005', '王蓝', '五年级B班', NULL ,70);  


    假设现在让你查询一下,A班哪些学生的数学成绩高于B班数学成绩的最小值,怎么办?我们可以采用如下 SQL:

    1. SELECT NAME FROM STUDENT WHERE CLASS='五年级A班' AND MATH >    
    2. (    
    3.     SELECT MIN(MATH) FROM STUDENT WHERE CLASS='五年级B班'    
    4. );   


    除此之外,我们还可以使用SOME或ANY。注意:ANY和 SOME 的作用完全和使用方式完全相同。

    1. SELECT NAME FROM STUDENT WHERE CLASS='五年级A班' AND MATH > ANY    
    2. (    
    3.     SELECT MATH FROM STUDENT WHERE CLASS='五年级B班'    
    4. );   


    假设现在让你查询一下,A班哪些学生的数学成绩高于B班数学成绩的最大值,怎么办呢?我们可以采用如下SQL:

    1. SELECT NAME FROM STUDENT WHERE CLASS='五年级A班' AND MATH >    
    2. (    
    3.     SELECT MAX(MATH) FROM STUDENT WHERE CLASS='五年级B班'    
    4. );    


    除此之外,我们还可以使用ALL,如下SQL所示:

    1. SELECT NAME FROM STUDENT WHERE CLASS='五年级A班' AND MATH > ALL    
    2. (    
    3.     SELECT MATH FROM STUDENT WHERE CLASS='五年级B班'    
    4. );  


    至此,我们可以总结出SOME,ANY,ALL 和 MIN, MAX 的对应关系:

    1. > ANY(sub-qurey)  ---  > MIN(sub-qurey)    
    2. < ANY(sub-query)  ---  < MAX(sub-qurey)    
    3. > ALL(sub-query)  ---  > MAX(sub-qurey)    
    4. < ALL(sub-query)  ---  < MIN(sub-qurey)  


    至此,你应该理解了SOME,ANY,ALL关键字的作用了吧。以上操作都针对数学成绩,如果你认为对语文成绩也执行类似的操作会得到类似的答案的话,那么你就错了。一切的原因都是因为NULL引起的。下面,我们来讨论NULL对各个关键字的影响。

    1. ---语句1    
    2. SELECT NAME FROM STUDENT WHERE CLASS='五年级A班' AND CHINESE >    
    3. (      
    4.     SELECT MAX(CHINESE) FROM STUDENT WHERE CLASS='五年级B班'      
    5. );  
    6.      
    7. ---语句2    
    8. SELECT NAME FROM STUDENT WHERE CLASS='五年级A班' AND CHINESE > ALL      
    9. (      
    10.     SELECT CHINESE FROM STUDENT WHERE CLASS='五年级B班'      
    11. );  


    通常,我们认为语句 1 和语句 2 会返回同样的结果,然而上面两条语句返回的结果却令人吃惊,语句1返回王五,语句2则什么也没返回,为什么会出现这样的情况呢?MAX 函数默认会忽略NULL值,所以语句1返回了王五。但是语句2不会忽略 NULL,任何值和 NULL 做比较都返回未知。不仅如此,下面两条语句也返回不同的结果:

      1. ---语句1    
      2. SELECT NAME FROM STUDENT WHERE CLASS='五年级A班' AND CHINESE <      
      3. (      
      4.     SELECT MIN(CHINESE) FROM STUDENT WHERE CLASS='五年级B班'      
      5. );  
      6.      
      7. ---语句2    
      8. SELECT NAME FROM STUDENT WHERE CLASS='五年级A班' AND CHINESE < ALL      
      9. (      
      10.     SELECT CHINESE FROM STUDENT WHERE CLASS='五年级B班'      
      11. ); 
  • 相关阅读:
    4号团队-团队任务4:每日例会(2018-11-30)
    4号团队-团队任务4:每日例会(2018-11-29)
    4号团队-团队任务4:每日例会
    4号团队-团队任务4:每日例会(2018-11-27)
    4号团队-团队任务4:每日例会(2018-11-28)
    个人总结
    1号团队-团队任务3:每日立会(2018-12-7)
    1号团队-团队任务3:每日立会(2018-12-6)
    1号团队-团队任务3:每日立会(2018-12-5)
    1号团队-团队任务3:每日立会(2018-12-4)
  • 原文地址:https://www.cnblogs.com/dirgo/p/4915669.html
Copyright © 2020-2023  润新知