some any oracle,oracle的some,any,all

any检查条件左边的表达式是否存在于条件右边的任何行中

some 和any进行一样的比较,some是为了区分关键字any和英文中的any,现在any仍然是关键字其和some的功能一样。

all检查条件左边的表达式对于条件右边的结果组中的所有行是否是正确的。

使用的语法相同 expression relational_operator(、=等条件) ALL|SOME|ANY sub-query| expression

例:SELECT * FROM SCOTT.EMP WHERE JOB !='SALESMAN' AND SAL>(SELECT (SAL+COMM) FROM SCOTT.EMP WHERE JOB='SALESMAN')

会返回一个错误说“一个单行查询返回多个结果”

SELECT * FROM SCOTT.EMP WHERE JOB !='SALESMAN' AND SAL>ANY(SELECT (SAL+COMM) FROM SCOTT.EMP WHERE JOB='SALESMAN')

这个sql的意思就是查询出非销售人员的工资大于销售人员工资加提成的人员

的结果是

1 7499 ALLEN SALESMAN 7698 1981-2-20 1600.00 300.00 30

2 7566 JONES MANAGER 7839 1981-4-2 2975.00   20

3 7698 BLAKE MANAGER 7839 1981-5-1 2850.00   30

4 7782 CLARK MANAGER 7839 1981-6-9 2450.00   10

5 7788 SCOTT ANALYST 7566 1987-4-19 3000.00   20

6 7839 KING PRESIDENT 1981-11-17 5000.00   10

7 7902 FORD ANALYST 7566 1981-12-3 3000.00   20

也就是说any,some,all 可以用来和一个结果集来对比。

SELECT * FROM SCOTT.EMP WHERE JOB !='SALESMAN' AND SAL>all(SELECT (SAL+COMM) FROM SCOTT.EMP WHERE JOB='SALESMAN' )

这个sql的意思是确定比销售人员工资高的员工也就是说他的工资要大于所有的销售人员,而any是大于任何一个销售人员

结果是

1 7566 JONES MANAGER 7839 1981-4-2 2975.00   20

2 7698 BLAKE MANAGER 7839 1981-5-1 2850.00   30

3 7788 SCOTT ANALYST 7566 1987-4-19 3000.00   20

4 7839 KING PRESIDENT 1981-11-17 5000.00   10

5 7902 FORD ANALYST 7566 1981-12-3 3000.00   20

1.parseCnMoney(cnMoney) 将中文大写钱数转换为小写 字符串 cnMoney:中文大写钱数。

如:parseCnMoney(“壹万两仟叁佰陆拾伍元叁角伍分”),返回值为12365.35。

2.toCnMoney(money) 将钱数转换为中文大写 字符串 money:小写钱数。

如:toCnMoney(12365.35),返回值为壹万两仟叁佰陆拾伍元叁角伍分

摘自《oracle8i性能设计及优化.pdf》

P80 ANY和SOME 操作符号

x > any (select sal from emp where job='ANA') 相当于

exists (select sal from emp where job='ANA' and x > sal)

P80 ALL操作符号

x > all(:first_sal,:second_sal) 相当于

x > :first_sal   and x > :second_sal

x > all (select sal from emp where deptno = 10) 相当于

not ( x <= any(select sal from emp where deptno = 10)) 相当于

not exists (select sal from where deptno=10 and x

摘自《Oracle高性能SQL调整》 P347 19.6 调整带有不相等条件的子查询

any 运算符

例如: 返回所有birthday > 出生于1985年之后的任何客户 的职员名称

select ename

from emp

where birthdate > any

(select birthdate from customer where birthdate > '31-DEC-1985')

上面的SQL语句可以优化为

select ename

from emp,(select min(birthdate) min_bday from customer where birthdate > '31-DEC-1985') in_line_view

where emp.birthdate > in_line_view.min_bday;

all 运算符

例如:

select ename

from emp

where birthdate > all

(select birthdate from customer where birthdate > '31-DEC-1985');

可以替换为

select ename

from emp,(select max(birthdate) max_bday from customer where birthdate > '31-DEC-1985') in_line_view

where emp.birthdate > in_line_view.max_bday;

总之,使用ALL和ANY的子查询总是可以用内嵌视图来代替,而且这个视图的性能要好的多,因为它利用了被连接表上的索引。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值