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的子查询总是可以用内嵌视图来代替,而且这个视图的性能要好的多,因为它利用了被连接表上的索引。