一、单子查询
说明:单子查询只返回一行记录,但父查询可以返回多行。在where条件中可以使用预算符<,>,=,<=,>=,<>
eg:
select * from emp where sal=(select min(sal) from emp)
结果
结果为 写道
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-12月-80 800 20
二:多行子查询
说明:子查询可以返货多行记录,单where条件中必须使用多行运算符in,not in,exists,no exists,all,any.一般情况下,不能确认子查询返回多少条数据,用多行子查询比较安全
in:where条件中必须在子查询中的某些记录也包含和它们相同的值。
eg:
select * from emp where sal in (select sal from emp where deptno=20) order by deptno
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-12月-80 800 20
7876 ADAMS CLERK 7788 23-5月 -87 1100 20
7566 JONES MANAGER 7839 02-4月 -81 2975 20
7788 SCOTT ANALYST 7566 19-4月 -87 3000 20
7902 FORD ANALYST 7566 03-12月-81 3000 20
not in:和 in 刚好相反 子查询中的记录必须不包含和他们相同的值。
eg:
select * from emp where sal not in (select sal from emp where deptno=20) order by deptno
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- -------------- ---------- ---------- ---------- 7782 CLARK MANAGER 7839 09-6月 -81 2450 10 7839 KING PRESIDENT 17-11月-81 5000 10 7934 MILLER CLERK 7782 23-1月 -82 1300 10 7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30 7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30 7900 JAMES CLERK 7698 03-12月-81 950 30 7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30 7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30 7698 BLAKE MANAGER 7839 01-5月 -81 850 30
9 rows selected.
any:如果用=any的时候,作用与in相同
如果>any, 意思是 比里面子查询中最小的大
SQL> select * from emp where sal >any (select sal from emp where deptno=20) order by deptno;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
7782 CLARK MANAGER 7839 09-6月 -81 2450 10
7839 KING PRESIDENT 17-11月-81 5000 10
7934 MILLER CLERK 7782 23-1月 -82 1300 10
7566 JONES MANAGER 7839 02-4月 -81 2975 20
7902 FORD ANALYST 7566 03-12月-81 3000 20
7876 ADAMS CLERK 7788 23-5月 -87 1100 20
7788 SCOTT ANALYST 7566 19-4月 -87 3000 20
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30
7900 JAMES CLERK 7698 03-12月-81 950 30
7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30
7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30
7698 BLAKE MANAGER 7839 01-5月 -81 2850 30
7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30
13 rows selected.
如果<any,意思是,比里面最大的小
1* select * from emp where sal<any (select sal from emp where deptno=20) order by deptno
SQL> /
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
7782 CLARK MANAGER 7839 09-6月 -81 2450 10
7934 MILLER CLERK 7782 23-1月 -82 1300 10
7369 SMITH CLERK 7902 17-12月-80 800 20
7566 JONES MANAGER 7839 02-4月 -81 2975 20
7876 ADAMS CLERK 7788 23-5月 -87 1100 20
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30
7900 JAMES CLERK 7698 03-12月-81 950 30
7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30
7698 BLAKE MANAGER 7839 01-5月 -81 2850 30
7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30
7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30
11 rows selected.
all:如果=all的时候,作用也与in相同
如果>all,意思是比里面子查询中最大的还大。
1* select * from emp where sal>all (select sal from emp where deptno=20) order by deptno
SQL> /
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- ------- ---------- -------------- - --------- ---------- ----------
7839 KING PRESIDENT 17-11月-81 5000 10
如果<all,意思是比里面子查询中最小的还小。
select * from emp where sal<all (select sal from emp where deptno=20) order by deptno;
no rows selected