原文地址: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. [转]jquery-confirm

    本文转自:http://craftpip.github.io/jquery-confirm/ Practical Uses These features can practically be used ...

  2. uva 572 oil deposits——yhx

    Oil Deposits  The GeoSurvComp geologic survey company is responsible for detecting underground oil d ...

  3. 【jQuery Demo】jQuery打造动态下滑菜单

    作者:漫凯维奇      来源:[教程]jQuery打造动态下滑菜单 Tip:这只是一个转载,源代码可以在上面的来源博文中下载 此教程将分步讲解如何使用JQuery和CSS打造一个炫酷动感菜单.效果如 ...

  4. 手把手教你如何用ZBrush刻画脸部

    今天的ZBrush教程我们将参照一张效果图对模型进行脸部刻画.在进入课堂之前我们有必要对Layers层概念和操作有所了解,然后结合之前学习的雕刻笔刷对模型的特征表情给予重点刻画. 详细的视频教程地址请 ...

  5. 该怎么快速完成ZBrush中脸部的雕刻

    骨骼,是一门基础艺术,几百年来一直为伟大的艺术大师所研究,它曾经,也将一直是创作现实且可信角色的关键,提高骨骼知识更将大大提高雕刻技能. 若有疑问可直接访问:http://www.zbrushcn.c ...

  6. POJ 3304 Segments --枚举,几何

    题意: 给n条线段,问有没有一条直线,是每条线段到这条直线上的投影有一个公共点. 解法: 有公共点说明有一条这条直线的垂线过所有线段,要找一条直线过所有线段,等价于从所有线段中任选两端点形成的直线存在 ...

  7. POJ 3304 Segments【叉积】

    题意:有n条线段,问有没有一条直线使得所有线段在这条直线上的投影至少有一个共同点. 思路:逆向思维,很明显这个问题可以转化为是否有一条直线穿过所有线段,若有,问题要求的直线与该直线垂直,并且公共点为垂 ...

  8. 关于 app测试工具

    1. 腾讯的GT 2. testin 云测 3. monkey的自动化测试 4. 纯手工的功能测试.

  9. ASP代码审计一枚

    <% On Error Resume Next dim name, pass, sql, action set conn = server.CreateObject("ADODB.Co ...

  10. Android Studio中提示:Project SDK is not defined

    Android Studio中提示:Project SDK is not defined 2015 年 4 月 1 日 下午 9:04crifan已有2209人围观我来说几句 [背景] 之前用Andr ...