zoukankan      html  css  js  c++  java
  • [转]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. ); 
  • 相关阅读:
    某个牛人做WINDOWS系统文件详解
    常用ASP脚本程序集锦
    LINUX基础:文件安全与权限
    proftpd+mysql+quota
    apache2.0.49tomcat5.0.19jk2建立virtualHost
    URL Redirection(转) Anny
    顶级域名后缀列表(转) Anny
    \u4E00\u9FA5意义 Anny
    How to POST Form Data Using Ruby(转) Anny
    How to get rid of 'Enter password to unlock your login keyring' in Ubuntu(转) Anny
  • 原文地址:https://www.cnblogs.com/dirgo/p/4915669.html
Copyright © 2011-2022 走看看