[转]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条件是: "...... ...
随机推荐
- runc的detach, console, tty等相关问题
runc 端解析: 1. runc/utils_linux.go func (r *runner) run(config *specs.Process) (int , error) 在该函数中第一次对 ...
- TestNG之参数化
TestNG提供了两种参数化的方式,一种是通过XML,一种是通过代码实现,下面对这两种方式做介绍. 一.通过xml /** * <suite name="Suite" par ...
- Codeforces 13C Sequence --DP+离散化
题意:给出一个 n (1 <= n <= 5000)个数的序列 .每个操作可以把 n 个数中的某一个加1 或 减 1.问使这个序列变成非递减的操作数最少是多少 解法:定义dp[i][j]为 ...
- Linux 常用基本命令
这两天有俩哥们问了我linux的事,问我在工作中需不需要用到,需不需要学会 一个是工作1年不到的,我跟他说,建议你学学,在以后肯定是要用到的,虽然用到的机会不多,但是会总比不会好 另一个是工作6年的, ...
- flex4的s:states和mx:states的区别
http://help.adobe.com/en_US/Flex/4.0/UsingSDK/WS2db454920e96a9e51e63e3d11c0bf63611-7ffa.html#WS43468 ...
- 十个Flex/Air疑难杂症及解决方案简略
十个Flex/Air疑难杂症及解决方案简略 转自http://blog.sban.us/40.html 最近去一家台企,对方给我出了十道“难道”:在TileList中如果選擇檔過多,會出現捲軸,當拖動 ...
- HTTPWatch使用
注意:现在httpwatch也可以集成到火狐浏览器中. 一.介绍 HttpWatch是强大的网页数据分析工具.集成在Internet Explorer工具栏.包括网页摘要.Cookies管理.缓存管理 ...
- SAP中主数据和单据的删除
在SAP实际操作的过程中,有些主数据或者单据需要删除,但是删除的方法却不尽相同,所以笔者今天总结了下,供大家参考. 1,用T-Code去删除 例如我们要删除某个物料,我们可以用T-Code MM06 ...
- http协议详解<一>
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://7826443.blog.51cto.com/7816443/1729227 写在 ...
- [原创]CI持续集成系统环境---部署Gitlab环境完整记录
Gitlab是一个代码托管平台,在实际工作中,对代码管理十分有用. 废话不多说,下面是对我自己搭建的Gitlab环境做一记录: (1)安装 ------------------------------ ...