[转]Oracle SOME,ANY,All,EXISTS,IN
原文地址:http://blog.csdn.net/shangboerds/article/details/43983791
-- Start
这几个关键字有一个共同点,那就是它们一般应用于子查询中。大家对 IN 和 EXISTS 都比较熟悉,这里我就不介绍了,下面我们看一看如何使用其他几个关键字,首先,我们定义如下表:
- --学生
- CREATE TABLE STUDENT
- (
- ID VARCHAR2(8), ---学号
- NAME VARCHAR2(20), ---姓名
- CLASS VARCHAR2(20), ---班级
- CHINESE NUMBER(5), ---语文成绩
- MATH NUMBER(5) ---数学成绩
- );
- INSERT INTO STUDENT (ID, NAME, CLASS, CHINESE, MATH) VALUES ('20090001', '张三', '五年级A班', 80 ,90);
- INSERT INTO STUDENT (ID, NAME, CLASS, CHINESE, MATH) VALUES ('20090002', '李四', '五年级A班', 60 ,75);
- INSERT INTO STUDENT (ID, NAME, CLASS, CHINESE, MATH) VALUES ('20090003', '王五', '五年级A班', 90 ,95);
- INSERT INTO STUDENT (ID, NAME, CLASS, CHINESE, MATH) VALUES ('20090004', '赵红', '五年级B班', 70 ,90);
- INSERT INTO STUDENT (ID, NAME, CLASS, CHINESE, MATH) VALUES ('20090004', '李白', '五年级B班', 85 ,80);
- INSERT INTO STUDENT (ID, NAME, CLASS, CHINESE, MATH) VALUES ('20090005', '王蓝', '五年级B班', NULL ,70);
假设现在让你查询一下,A班哪些学生的数学成绩高于B班数学成绩的最小值,怎么办?我们可以采用如下 SQL:
- SELECT NAME FROM STUDENT WHERE CLASS='五年级A班' AND MATH >
- (
- SELECT MIN(MATH) FROM STUDENT WHERE CLASS='五年级B班'
- );
除此之外,我们还可以使用SOME或ANY。注意:ANY和 SOME 的作用完全和使用方式完全相同。
- SELECT NAME FROM STUDENT WHERE CLASS='五年级A班' AND MATH > ANY
- (
- SELECT MATH FROM STUDENT WHERE CLASS='五年级B班'
- );
假设现在让你查询一下,A班哪些学生的数学成绩高于B班数学成绩的最大值,怎么办呢?我们可以采用如下SQL:
- SELECT NAME FROM STUDENT WHERE CLASS='五年级A班' AND MATH >
- (
- SELECT MAX(MATH) FROM STUDENT WHERE CLASS='五年级B班'
- );
除此之外,我们还可以使用ALL,如下SQL所示:
- SELECT NAME FROM STUDENT WHERE CLASS='五年级A班' AND MATH > ALL
- (
- SELECT MATH FROM STUDENT WHERE CLASS='五年级B班'
- );
至此,我们可以总结出SOME,ANY,ALL 和 MIN, MAX 的对应关系:
- > ANY(sub-qurey) --- > MIN(sub-qurey)
- < ANY(sub-query) --- < MAX(sub-qurey)
- > ALL(sub-query) --- > MAX(sub-qurey)
- < ALL(sub-query) --- < MIN(sub-qurey)
至此,你应该理解了SOME,ANY,ALL关键字的作用了吧。以上操作都针对数学成绩,如果你认为对语文成绩也执行类似的操作会得到类似的答案的话,那么你就错了。一切的原因都是因为NULL引起的。下面,我们来讨论NULL对各个关键字的影响。
- ---语句1
- SELECT NAME FROM STUDENT WHERE CLASS='五年级A班' AND CHINESE >
- (
- SELECT MAX(CHINESE) FROM STUDENT WHERE CLASS='五年级B班'
- );
- ---语句2
- SELECT NAME FROM STUDENT WHERE CLASS='五年级A班' AND CHINESE > ALL
- (
- SELECT CHINESE FROM STUDENT WHERE CLASS='五年级B班'
- );
通常,我们认为语句 1 和语句 2
会返回同样的结果,然而上面两条语句返回的结果却令人吃惊,语句1返回王五,语句2则什么也没返回,为什么会出现这样的情况呢?MAX
函数默认会忽略NULL值,所以语句1返回了王五。但是语句2不会忽略 NULL,任何值和 NULL
做比较都返回未知。不仅如此,下面两条语句也返回不同的结果:
- ---语句1
- SELECT NAME FROM STUDENT WHERE CLASS='五年级A班' AND CHINESE <
- (
- SELECT MIN(CHINESE) FROM STUDENT WHERE CLASS='五年级B班'
- );
- ---语句2
- SELECT NAME FROM STUDENT WHERE CLASS='五年级A班' AND CHINESE < ALL
- (
- SELECT CHINESE FROM STUDENT WHERE CLASS='五年级B班'
- );
[转]Oracle SOME,ANY,All,EXISTS,IN的更多相关文章
- Oracle中没有 if exists(...)
对于Oracle中没有 if exists(...) 的语法,目前有许多种解决方法,这里先分析常用的三种,推荐使用最后一种 第一种是最常用的,判断count(*)的值是否为零,如下declare v ...
- Oracle下的IF EXISTS()
妈蛋..作为一个使用了SQL SERVER有4 5年的程序猿,开始用Oracle真他妈不习惯.写法真他妈不一样.比如像写个像IF EXISTS(SELECT * FROM sys.tables WHE ...
- ORACLE 中IN和EXISTS比较
ORACLE 中IN和EXISTS比较 EXISTS的执行流程 select * from t1 where exists ( select null from t2 where y = x ...
- [转]Oracle中没有 if exists(...)
本文转自:http://blog.csdn.net/hollboy/article/details/7550171 对于Oracle中没有 if exists(...) 的语法,目前有许多种解决方法, ...
- Oracle中没有 if exists(...)的解决方法
http://blog.csdn.net/hollboy/article/details/7550171对于Oracle中没有 if exists(...) 的语法,目前有许多种解决方法,这里先分析常 ...
- Oracle中in和exists的选择
在ORACLE 11G大行其道的今天,还有很多人受早期版本的影响,记住一些既定的规则, 1.子查询结果集小,用IN 2.外表小,子查询表大,用EXISTS 摘自:http://blog.chi ...
- 【转】oracle中in和exists的区别
原文地址:http://blog.itpub.net/7478833/viewspace-441043/ 感谢作者 in 和 exists区别 in 是把外表和内表作hash join,而ex ...
- 关于oracle中in和exists的区别
一般来说,这两个是用来做两张(或更多)表联合查询用的,in是把外表和内表作hash 连接,而exists 是对外表作loop 循环,假设有A.B两个表,使用时是这样的: 1.select * from ...
- oracle中in与exists的区别
exists是用来判断是否存在的,当exists中的查询存在结果时则返回真,否则返回假.not exists则相反. exists做为where 条件时,是先对where 前的主查询询进行查询,然后用 ...
- Oracle中 in、exists、not in,not exists的比较
最基本的区别: in 对主表使用索引 exists 对子表使用索引 not in 不使用索引 not exists 对主子表都使用索引 写法: exist的where条件是: "...... ...
随机推荐
- 关于TouchEvent里面的touches,targetTouches,changedTouches的解释
touches:手指触摸到屏幕上引起的当前所有触摸点的集合; targetTouches:手指触摸到绑定事件的节点上的触摸点的集合; changedTouches:触摸事件时改变触摸点的集合; 以下 ...
- 【ASP.NET 进阶】定时执行任务
原理:利用全局应用程序类 Global.asax 和 System.Timers.Timer 类定时处理任务. 示例效果图: 其 Global.asax 类代码如下: using System; u ...
- 怎样用好ZBrush中的PaintStop插件
PaintStop是ZBrush®3.1的手绘插件,可以比较真实的模拟手绘风格,尤其是用水彩笔刷画水墨风格画.PaintStop插件可供用户免费使用. PaintStop是一款功能强大的插件,已经被添 ...
- UVA 12382 Grid of Lamps --贪心+优先队列
题意:给出每行每列至少有的灯泡数,问最少有的灯泡数. 解法:要使灯泡数尽量小,说明要使交叉点尽量多,这样即抵了行,又抵了列,为最优的.所以可以用行来消去列,也可以用列来消去行,我这里是列来消去行.首先 ...
- Hanoi塔
2016-03-19 17:01:35 问题描述: 假设有三个命名为 A B C 的塔座 ,在塔座A上插有n个直径大小不相同,由小到大编号为1 ,2 ,3 ,··· ,n的圆盘,要求将A座上的圆盘移至 ...
- Ajax类库需要注意的问题
构建Ajax类库时,注意四步就可以了: 1:创建Ajax 对象 2:链接服务器 3:发送请求 4:返回响应 下面是我自己写的一个Ajax类库: function ajax(url,fnn,fai) ...
- MySQL数据库学习笔记(一)----MySQL 5.6.21的安装和配置(setup版)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- java22 - 1 多线程之 单线程和多线程的图解
- 静态时序分析(static timing analysis) --- 时序路径
时序分析工具会找到且分析设计中的所有路径.每一个路径有一个起点(startpoint)和一个终点(endpoint).起点是设计中数据被时钟沿载入的那个时间点,而终点则是数据通过了组合逻辑被另一个时间 ...
- Windows Phone:自定义字体在xaml和代码中使用
最近,我的小应用<认字>更新了一个能发声的版本,朋友对Speech做读音没有兴趣,反而对其中使用的楷体文字表示了兴趣,也许Speech的文章比较多,这次我对这个自定义字体在xaml和代码中 ...