原文地址: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. INSERT INTO STUDENT (ID, NAME, CLASS, CHINESE, MATH) VALUES ('20090001', '张三', '五年级A班', 80 ,90);
  11. INSERT INTO STUDENT (ID, NAME, CLASS, CHINESE, MATH) VALUES ('20090002', '李四', '五年级A班', 60 ,75);
  12. INSERT INTO STUDENT (ID, NAME, CLASS, CHINESE, MATH) VALUES ('20090003', '王五', '五年级A班', 90 ,95);
  13. INSERT INTO STUDENT (ID, NAME, CLASS, CHINESE, MATH) VALUES ('20090004', '赵红', '五年级B班', 70 ,90);
  14. INSERT INTO STUDENT (ID, NAME, CLASS, CHINESE, MATH) VALUES ('20090004', '李白', '五年级B班', 85 ,80);
  15. 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. ---语句2
  7. SELECT NAME FROM STUDENT WHERE CLASS='五年级A班' AND CHINESE > ALL
  8. (
  9. SELECT CHINESE FROM STUDENT WHERE CLASS='五年级B班'
  10. );

通常,我们认为语句 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. ---语句2
    7. SELECT NAME FROM STUDENT WHERE CLASS='五年级A班' AND CHINESE < ALL
    8. (
    9. SELECT CHINESE FROM STUDENT WHERE CLASS='五年级B班'
    10. );

[转]Oracle SOME,ANY,All,EXISTS,IN的更多相关文章

  1. Oracle中没有 if exists(...)

    对于Oracle中没有 if exists(...) 的语法,目前有许多种解决方法,这里先分析常用的三种,推荐使用最后一种 第一种是最常用的,判断count(*)的值是否为零,如下declare  v ...

  2. Oracle下的IF EXISTS()

    妈蛋..作为一个使用了SQL SERVER有4 5年的程序猿,开始用Oracle真他妈不习惯.写法真他妈不一样.比如像写个像IF EXISTS(SELECT * FROM sys.tables WHE ...

  3. ORACLE 中IN和EXISTS比较

    ORACLE 中IN和EXISTS比较 EXISTS的执行流程      select * from t1 where exists ( select null from t2 where y = x ...

  4. [转]Oracle中没有 if exists(...)

    本文转自:http://blog.csdn.net/hollboy/article/details/7550171 对于Oracle中没有 if exists(...) 的语法,目前有许多种解决方法, ...

  5. Oracle中没有 if exists(...)的解决方法

    http://blog.csdn.net/hollboy/article/details/7550171对于Oracle中没有 if exists(...) 的语法,目前有许多种解决方法,这里先分析常 ...

  6. Oracle中in和exists的选择

    在ORACLE 11G大行其道的今天,还有很多人受早期版本的影响,记住一些既定的规则,   1.子查询结果集小,用IN   2.外表小,子查询表大,用EXISTS 摘自:http://blog.chi ...

  7. 【转】oracle中in和exists的区别

    原文地址:http://blog.itpub.net/7478833/viewspace-441043/ 感谢作者   in 和 exists区别   in 是把外表和内表作hash join,而ex ...

  8. 关于oracle中in和exists的区别

    一般来说,这两个是用来做两张(或更多)表联合查询用的,in是把外表和内表作hash 连接,而exists 是对外表作loop 循环,假设有A.B两个表,使用时是这样的: 1.select * from ...

  9. oracle中in与exists的区别

    exists是用来判断是否存在的,当exists中的查询存在结果时则返回真,否则返回假.not exists则相反. exists做为where 条件时,是先对where 前的主查询询进行查询,然后用 ...

  10. Oracle中 in、exists、not in,not exists的比较

    最基本的区别: in 对主表使用索引 exists 对子表使用索引 not in 不使用索引 not exists 对主子表都使用索引 写法: exist的where条件是: "...... ...

随机推荐

  1. 观nginx与lvs负载均衡的较量

    在技术工作者中,常用到的就是lvs负载均衡和Nginx负载均衡了.这两者也是比较普及的.那么,根据不同的需求,两者存在着不同的优势.具体选择哪一个,还要看您的要求了.那么我们在此为大家分享一篇文章,对 ...

  2. 【读书笔记《Android游戏编程之从零开始》】19.游戏开发基础(游戏音乐与音效)

    在一款游戏中,除了华丽的界面 UI 直接吸引玩家外,另外重要的就是游戏的背景音乐与音效:合适的背景音乐以及精彩的音效搭配会令整个游戏上升一个档次. 在 Android 中.常用于播放游戏背景音乐的类是 ...

  3. codeforces 712B B. Memory and Trident(水题)

    题目链接: B. Memory and Trident time limit per test 2 seconds memory limit per test 256 megabytes input ...

  4. HDU 1576 A/B【扩展欧几里德】

    设A/B=x,则A=Bx n=A%9973=A-9973*y=Bx-9973*y 用扩展欧几里德求解 #include<stdio.h> #include<string.h> ...

  5. Ajax类库需要注意的问题

    构建Ajax类库时,注意四步就可以了: 1:创建Ajax  对象 2:链接服务器 3:发送请求 4:返回响应 下面是我自己写的一个Ajax类库: function ajax(url,fnn,fai) ...

  6. smarty中section遍历数组

    smarty中section遍历数组

  7. kvm虚拟机时间修改

    在虚拟化环境中,虚拟机在长时间运行过程中,时间会变慢,通常的作法是配置ntpdate定时与时间服务器进行时间同步的计划任务.KVM虚拟机默认采用utc时间,需要专门修改,以及考虑kvm时间同步问题.1 ...

  8. 22Spring_JdbcTemplatem模板工具类的使用——使用外部属性文件来配置(properties)

    前一篇文章写得是xml文件来配置数据库连接的.但是为了方便,我们实际中采用的是properties文件的方式来配置数据库的.修改properties 文件 会比 修改 xml文件 方便. 做法是: 将 ...

  9. Oracle11G 卸载步骤

    (之前因为不知道偶电脑是因为安装了oracle后,才导致的长达两周的开机速度要足足10分钟,以前只有一分钟不到!可以想象oracle的服务启动的强大,知道后,偶果断立即卸载掉!) 一.在oracle1 ...

  10. jquery 删除字符串最后一个字符的方法

    字符串:var s = "1,2,3,4,5," 目标:删除最后一个 "," 方法: s=s.substring(0,s.Length-1): 字符串:var ...