在oracle的子查询中使用some,any和all

本文介绍了在SQL中使用some、any及all关键字处理子查询多行结果的方法,通过具体实例展示了这些关键字如何简化复杂的SQL语句。
用some,any和all对子查询中返回的多行结果进行处理。下面我们来简单介一下这几个关键词的含义。 •Some在此表示满足其中一个的意义,是用or串起来的比较从句。 •Any也表示满足其中一个的意义,也是用or串起来的比较从句,区别是any一般用在非“=”的比较关系中,这也很好理解,英文中的否定句中使用any肯定句中使用sone,这一点是一样的。 •All则表示满足其其中所有的查询结果的含义,使用and串起来的比较从句。 下面是一些例子[@more@]找出员工中,只要比部门号为10的员工中的任何一个员工的工资高的员工的姓名个工资。也就是说只要比部门号为10的员工中的那个工资最少的员工的工资高就满足条件。 select ename,sal From emp Where sal > any(select sal from emp where deptno = 10); 这里推荐用any,如果你非要用some也是没有任何问题的,结果是一样的,只是一般来讲some用在“=”的比较从句中。 select ename,sal From emp Where sal > some(select sal from emp where deptno = 10); 上面的用法完全OK的。 select ename,sal From emp Where sal = some(select sal from emp where deptno = 30) and deptno not in (select deptno from emp where deptno = 30); 上面才是some的正常用法。其含义是找到和30部门员工的任何一个人工资相同的那些员工。虽然没有找到。 最后一个关键字all的用法也很简单就是要与子查询的每一结果都要匹配。 select ename,sal From emp Where sal > all(select sal from emp where deptno = 20); 上面的SQL语句的意义与前面的就完全不一样了,其意义是找到比部门号为20的员工的所有员工的工资都要高的员工,也就是比那个工资最高的员工的还要高的员工 总的来说some和any用法意义是一样的,仅在词法上有不同,都表示对子查询结果集中“或”的比较关系,而all则是对子查询结果集总每一个结果“与”的关系 **************************************************************************************************************************** 这是在Oracle中比较容易被忽视的两个条件函数,但这两个函数其实对简化Sql语句是非常重要的作用的。   例如 scott@eddev> select ename, sal from emp where sal > any (1600, 2999); ENAME SAL ---------- ---------- JONES 2975 BLAKE 2850 CLARK 2450 SCOTT 3000 KING 5000 FORD 3000 6 rows selected. 实际上以上语句可以等于: select ename, sal from emp where sal > 1600 or sal > 2999; 所以Any是等于N个or语句。 又如 select ename from emp where substr(ename,1,1) = any ('A', 'W', 'J'); 等同于: select ename from emp where substr(ename,1,1) = 'A' or substr(ename,1,1) ='W' or substr(ename,1,1) ='J'; 另外 scott@eddev> select ename, sal from emp where sal > all (1600, 2999); ENAME SAL ---------- ---------- SCOTT 3000 KING 5000 FORD 3000 实际上以上语句可以等于: select ename, sal from emp where sal > 1600 and sal > 2999; 所以All是等于N个And语句。这是在Oracle中比较容易被忽视的两个条件函数,但这两个函数其实对简化Sql语句是非常重要的作用的。   例如 scott@eddev> select ename, sal from emp where sal > any (1600, 2999); ENAME SAL ---------- ---------- JONES 2975 BLAKE 2850 CLARK 2450 SCOTT 3000 KING 5000 FORD 3000 6 rows selected. 实际上以上语句可以等于: select ename, sal from emp where sal > 1600 or sal > 2999; 所以Any是等于N个or语句。 又如 select ename from emp where substr(ename,1,1) = any ('A', 'W', 'J'); 等同于: select ename from emp where substr(ename,1,1) = 'A' or substr(ename,1,1) ='W' or substr(ename,1,1) ='J'; 另外 scott@eddev> select ename, sal from emp where sal > all (1600, 2999); ENAME SAL ---------- ---------- SCOTT 3000 KING 5000 FORD 3000 实际上以上语句可以等于: select ename, sal from emp where sal > 1600 and sal > 2999; 所以All是等于N个And语句。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7490392/viewspace-1052053/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/7490392/viewspace-1052053/

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值