目录
ANY
=ANY :功能上与 IN 是没有任何区别的
>ANY :比子查询返回的最小值要大
ALL
>AL :比子查询返回的最大值要大
EXISTS() 判断
NOT EXISTS
Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645
在 WHERE 子句里面主要提供 3 个运算符: IN、ANY、ALL
前面讲了IN
ANY
ANY 操作实质上有 3 种子语法
=ANY :功能上与 IN 是没有任何区别的
SQL> select * from emp2 where sal=any(select sal from emp where job='MANAGER');EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------7566 JONES MANAGER 7839 02-4月 -81 2975 207698 BLAKE MANAGER 7839 01-5月 -81 2850 307782 CLARK MANAGER 7839 09-6月 -81 2450 10
>ANY :比子查询返回的最小值要大
SQL> select * from emp2 where sal>any(select sal from emp where job='MANAGER');EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------7839 KING PRESIDENT 17-11月-81 5000 107902 FORD ANALYST 7566 03-12月-81 3000 207566 JONES MANAGER 7839 02-4月 -81 2975 207698 BLAKE MANAGER 7839 01-5月 -81 2850 30
因为子查询中有 3 个值: 2975、2850 和 2450,最小的是 2450
所以
>ANY 操作返回所有比 2450 大的记录
<ANY :比子查询返回的最大的值要小
SQL> select * from emp2 where sal<any(select sal from emp where job='MANAGER');EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------7369 SMITH CLERK 7902 17-12月-80 800 207900 JAMES CLERK 7698 03-12月-81 950 307521 WARD SALESMAN 7698 22-2月 -81 1250 500 307654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 307934 MILLER CLERK 7782 23-1月 -82 1300 107844 TURNER SALESMAN 7698 08-9月 -81 1500 0 307499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 307782 CLARK MANAGER 7839 09-6月 -81 2450 107698 BLAKE MANAGER 7839 01-5月 -81 2850 30
因为子查询中有 3 个值: 2975、2850 和 2450,最大的是 2975
所以
<ANY 操作返回所有比 2975 小的记录
ALL
AL 操作有两种使用形式
>AL :比子查询返回的最大值要大
SQL> select * from emp2 where sal>ALL(select sal from emp where job='MANAGER');EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------7902 FORD ANALYST 7566 03-12月-81 3000 207839 KING PRESIDENT 17-11月-81 5000 10
因为子查询中有 3 个值: 2975、2850 和 2450,最大的是 2975
所以
>AL 操作返回所有比 2975 大的记录
<AL :比子查询返回的最小值要小
SQL> select * from emp2 where sal<ALL(select sal from emp where job='MANAGER');EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 307844 TURNER SALESMAN 7698 08-9月 -81 1500 0 307934 MILLER CLERK 7782 23-1月 -82 1300 107521 WARD SALESMAN 7698 22-2月 -81 1250 500 307654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 307900 JAMES CLERK 7698 03-12月-81 950 307369 SMITH CLERK 7902 17-12月-80 800 20
因为子查询中有 3 个值: 2975、2850 和 2450,最小的是 2450
所以
>AL 操作返回所有比 2450 小的记录
EXISTS() 判断
SQL> SELECT * FROM emp2 WHERE EXISTS( SELECT * FROM emp WHERE empno=7839) ;EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------7369 SMITH CLERK 7902 17-12月-80 800 207499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 307521 WARD SALESMAN 7698 22-2月 -81 1250 500 307566 JONES MANAGER 7839 02-4月 -81 2975 207654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 307698 BLAKE MANAGER 7839 01-5月 -81 2850 307782 CLARK MANAGER 7839 09-6月 -81 2450 107839 KING PRESIDENT 17-11月-81 5000 107844 TURNER SALESMAN 7698 08-9月 -81 1500 0 307900 JAMES CLERK 7698 03-12月-81 950 307902 FORD ANALYST 7566 03-12月-81 3000 207934 MILLER CLERK 7782 23-1月 -82 1300 108989 HELLO
因为子查询“ (SELECT * FROM emp WHERE empno=7839) ”有查询结果,
所以 EXISTS() 就认为数据存在,外部查询可以查询出内容
SQL> select * from emp2 where exists(3 select 'hello' from dual where 1=1);EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------7369 SMITH CLERK 7902 17-12月-80 800 207499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 307521 WARD SALESMAN 7698 22-2月 -81 1250 500 307566 JONES MANAGER 7839 02-4月 -81 2975 207654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 307698 BLAKE MANAGER 7839 01-5月 -81 2850 307782 CLARK MANAGER 7839 09-6月 -81 2450 107839 KING PRESIDENT 17-11月-81 5000 107844 TURNER SALESMAN 7698 08-9月 -81 1500 0 307900 JAMES CLERK 7698 03-12月-81 950 307902 FORD ANALYST 7566 03-12月-81 3000 207934 MILLER CLERK 7782 23-1月 -82 1300 108989 HELLO
EXISTS() 只关心子查询里面返回的是否有数据行,至于是什么数据行,它不关心
因此,上面的查 询语句实现的效果也是查询出数据表 emp 中全部记录
NOT EXISTS
SQL> select * from emp2 where NOT exists(3 select 'hello' from dual where 1=2);EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------7369 SMITH CLERK 7902 17-12月-80 800 207499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 307521 WARD SALESMAN 7698 22-2月 -81 1250 500 307566 JONES MANAGER 7839 02-4月 -81 2975 207654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 307698 BLAKE MANAGER 7839 01-5月 -81 2850 307782 CLARK MANAGER 7839 09-6月 -81 2450 107839 KING PRESIDENT 17-11月-81 5000 107844 TURNER SALESMAN 7698 08-9月 -81 1500 0 307900 JAMES CLERK 7698 03-12月-81 950 307902 FORD ANALYST 7566 03-12月-81 3000 207934 MILLER CLERK 7782 23-1月 -82 1300 108989 HELLO