原文地址: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. 怎样用ZBrush中的Curves和Insert笔刷创建四肢

     之前的ZBrush教程给大家介绍了人体结构比例和肌肉走向,同时使用ZBrush®软件中的CuverTube笔刷为模型添加了颈部和手臂.使用InsertSphere笔刷添加腰部,本讲将继续使用Curv ...

  2. AutoIT脚本的语法特征

    这里主要介绍AutoIT的脚本语法特征,包括变量.关键字.宏.设置选项等,详细的语法细节,可以参考其用户手册,也可以去AutoIT中文论坛(www.autoit.net.cn)交流. 1. 变量 Au ...

  3. Android 三种动画详解

    [工匠若水 http://blog.csdn.net/yanbober 转载请注明出处.点我开始Android技术交流] 1 背景 不能只分析源码呀,分析的同时也要整理归纳基础知识,刚好有人微博私信让 ...

  4. Android Parcelable和Serializable的区别,androidparcelable

    本文主要介绍Parcelable和Serializable的作用.效率.区别及选择,关于Serializable的介绍见Java 序列化的高级认识. 1.作用 Serializable的作用是为了保存 ...

  5. SVN和git的使用(附github的简单玩法)

    今天简单的总结了下SVN和git的使用,也尝试了下github,应该好好提高下自己的英文水平了,梦想有一天不再使用任何翻译软件. [svn]:集中式的代码管理工具(版本控制工具--版本记录) 1> ...

  6. docker下部署gitlab

    docker用来隔离应用还是很方便的,一来本身的操作较为简单,二来资源占用也比虚拟机要小得多,三来也较为安全,因为像数据库这样的应用不会再全局暴露端口,同时应用间的通信通过加密和端口转发,更加安全. ...

  7. .Net core环境准备

    .Net core 出来有段日子了,在跨平台上迈出了坚实的一步,尽管如此身边还是有很多人都转向了Java阵营.抛开语言之争,在.net平台上工作多年,还是有必要了解下新推出的技术,没准有朝一日就用上了 ...

  8. POJ 1141 Brackets Sequence

    Brackets Sequence Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 29502   Accepted: 840 ...

  9. 【WPF】Winform调用WPF窗体注意事项

     1.需要添加一些引用 2.调用处使用如下方法进行调用 Window win= new Window(); ElementHost.EnableModelessKeyboardInterop(win) ...

  10. [转]SIFT特征提取分析

    SIFT(Scale-invariant feature transform)是一种检测局部特征的算法,该算法通过求一幅图中的特征点(interest points,or corner points) ...