Oracle的嵌套子查询可以使用Some,Any和All对子查询中返回的多行结果进行处理。
Some表示满足其中一个的含义,是用or串起来的比较从句。
例如:SELECT * FROM emp WHERE empno = 'hmz' OR dept = '10'
Any也表示满足其中一个的含义,也是用or串起来的比较从句。 Some和Any的区别就是:Some用在“=”的比较关系中。
英文中的否定句中使用any肯定句中使用some,这一点是一样的。
some和any都有“一些”的意思 some用在肯定句中,any用在否定句或疑问句中。 【注1】但表示期望得到肯定回答的疑问句中用some。 【注2】any还有“任何”的意思,some没有
比较:She's too old to do any work.她年事已高,干不了什么活了。
She's old enough to do some work.她已长大了,可以干些活了。
All则表示满足其中所有查询结果的含义,使用and串起来的比较从句。
【实例】
查询比部门号为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 = 30) AND deptno NOT IN (SELECT deptno FROM emp WHERE deptno = 30);
含义是找到和30号部门员工的任何一个人工资相同的那些员工。
最后一个关键字all的用法就是要与子查询的每一结果都要匹配。
SELECT ename,sal FROM emp WHERE sal > ALL(select sal from emp where deptno = 20);
上面的SQL语句的意义与前面的就完全不一样了,其意义是找到比部门号为20的员
工的所有员工的工资都要高的员工,也就是比那个工资最高的员工的还要高的员工。
总的来说some和any用法意义是一样的,仅在词法上有不同,都表示对子查询结果
集“或”的比较关系,而all则是对子查询结果集总每一个结果“与”的关系。
SQL> select * fromemp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO----- ---------- --------- ----- ----------- --------- --------- ------
7369 SMITH CLERK 7902 1980/12/17 800.00 20
7499 ALLEN SALESMAN 7698 1981/2/20 1600.00 300.00 30
7521 WARD SALESMAN 7698 1981/2/22 1250.00 500.00 30
7566 JONES MANAGER 7839 1981/4/2 2975.00 20
7654 MARTIN SALESMAN 7698 1981/9/28 1250.00 1400.00 30
7698 BLAKE MANAGER 7839 1981/5/1 2850.00 30
7782 CLARK MANAGER 7839 1981/6/9 2450.00 10
7788 SCOTT ANALYST 7566 1987/4/19 3000.00 20
7839 KING PRESIDENT 1981/11/17 5000.00 10
7844 TURNER SALESMAN 7698 1981/9/8 1500.00 0.00 30
7876 ADAMS CLERK 7788 1987/5/23 1100.00 20
7900 JAMES CLERK 7698 1981/12/3 950.00 30
7902 FORD ANALYST 7566 1981/12/3 3000.00 20
7934 MILLER CLERK 7782 1982/1/23 1300.00 10
14rows selected
SQL> select * from emp order bydeptno;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO----- ---------- --------- ----- ----------- --------- --------- ------
7782 CLARK MANAGER 7839 1981/6/9 2450.00 10
7839 KING PRESIDENT 1981/11/17 5000.00 10
7934 MILLER CLERK 7782 1982/1/23 1300.00 10
7566 JONES MANAGER 7839 1981/4/2 2975.00 20
7902 FORD ANALYST 7566 1981/12/3 3000.00 20
7876 ADAMS CLERK 7788 1987/5/23 1100.00 20
7369 SMITH CLERK 7902 1980/12/17 800.00 20
7788 SCOTT ANALYST 7566 1987/4/19 3000.00 20
7521 WARD SALESMAN 7698 1981/2/22 1250.00 500.00 30
7844 TURNER SALESMAN 7698 1981/9/8 1500.00 0.00 30
7499 ALLEN SALESMAN 7698 1981/2/20 1600.00 300.00 30
7900 JAMES CLERK 7698 1981/12/3 950.00 30
7698 BLAKE MANAGER 7839 1981/5/1 2850.00 30
7654 MARTIN SALESMAN 7698 1981/9/28 1250.00 1400.00 30
14rows selected
SQL> select ename,deptno,sal from emp where sal > any (select sal from emp where deptno=10);
ENAME DEPTNO SAL---------- ------ ---------
KING 10 5000.00FORD20 3000.00SCOTT20 3000.00JONES20 2975.00BLAKE30 2850.00CLARK10 2450.00ALLEN30 1600.00TURNER30 1500.00
8rows selected
SQL> select ename,deptno,sal from emp where sal > all (select sal from emp where deptno=10);
ENAME DEPTNO SAL---------- ------ ---------
SQL> select ename,deptno,sal from emp where sal > all (select sal from emp where deptno=20);
ENAME DEPTNO SAL---------- ------ ---------
KING 10 5000.00SQL>
SQL> select ename,deptno,sal from emp where sal < all (select sal from emp where deptno=10);
ENAME DEPTNO SAL---------- ------ ---------
WARD 30 1250.00MARTIN30 1250.00ADAMS20 1100.00JAMES30 950.00SMITH20 800.00SQL>SQL>SQL>SQL> select ename,deptno,sal from emp where sal < any (select sal from emp where deptno=10);
ENAME DEPTNO SAL---------- ------ ---------
SMITH 20 800.00JAMES30 950.00ADAMS20 1100.00WARD30 1250.00MARTIN30 1250.00MILLER10 1300.00TURNER30 1500.00ALLEN30 1600.00CLARK10 2450.00BLAKE30 2850.00JONES20 2975.00SCOTT20 3000.00FORD20 3000.00
13rows selected
SQL> select sal from emp where deptno=10
2;
SAL---------
2450.00
5000.00
1300.00SQL> select ename,deptno,sal from emp where sal < any (select sal from emp where deptno=20);
ENAME DEPTNO SAL---------- ------ ---------
SMITH 20 800.00JAMES30 950.00ADAMS20 1100.00WARD30 1250.00MARTIN30 1250.00MILLER10 1300.00TURNER30 1500.00ALLEN30 1600.00CLARK10 2450.00BLAKE30 2850.00JONES20 2975.00
11rows selected
SQL> select sal from emp where deptno=20;
SAL---------
800.00
2975.00
3000.00
1100.00
3000.00SQL> select ename,deptno,sal from emp where sal < all(select sal from emp where deptno=20);
ENAME DEPTNO SAL---------- ------ ---------
SQL>
>ANY是比最小的还要大
>ALL是比所有值都要大,即比最大的值还要大