Oracle 数据库入门之----------------------子查询

版权声明:本文为博主原创文章,希望大家转载时注明出处。 https://blog.csdn.net/Angel_guoo/article/details/84953088

子查询

SQL> set linesize 200

SQL> --查询工资比SCOTT高的员工信息

SQL> --1. SCOTT的工资

SQL> select sal from emp where ename='SCOTT';

 

       SAL                                                                                                                                                                                              

----------                                                                                                                                                                                              

      3000                                                                                                                                                                                              

 

SQL> --2. 查询比3000高的员工

SQL> select * from emp where sal >3000;

 

     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO                                                                                                              

---------- ---------- --------- ---------- -------------- ---------- ---------- ----------                                                                                                              

      7839 KING       PRESIDENT            17-11-81           5000                    10                                                                                                              

 

SQL> --子查询所要解决的问题:不能一步求解

SQL> select *

  2  from emp

  3  where sal > (select sal

  4               from emp

  5               where ename='SCOTT');

 

     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO                                                                                                              

---------- ---------- --------- ---------- -------------- ---------- ---------- ----------                                                                                                              

      7839 KING       PRESIDENT            17-11-81           5000                    10                                                                                                              

 

SQL> /*

SQL> 注意的问题:1

SQL> 1、括号

SQL> 2、合理的书写风格

SQL> 3、可以在主查询的where select having  from 后面使用子查询

SQL> 4、不可以在group by使用子查询

SQL> 5、强调from后面的子查询

SQL> 6、主查询和子查询可以不是同一张表;只有子查询返回的结果 主查询可以使用 即可

SQL> 7、一般不在子查询中排序;但在top-n分析问题中 必须对子查询排序

SQL> 8、一般先执行子查询,再执行主查询;但相关子查询例外

SQL> 9、单行子查询只能使用单行操作符;多行子查询只能使用多行操作符

SQL> 10、子查询中的null

SQL> */

SQL> --3、可以在主查询的where select having  from 后面使用子查询

SQL> select empno,ename,sal,(select job from emp where empno=7839) 四列

  2  from emp;

 

     EMPNO ENAME             SAL 四列                                                                                                                                                                 

---------- ---------- ---------- ---------                                                                                                                                                              

      7369 SMITH             800 PRESIDENT                                                                                                                                                              

      7499 ALLEN            1600 PRESIDENT                                                                                                                                                              

      7521 WARD             1250 PRESIDENT                                                                                                                                                              

      7566 JONES            2975 PRESIDENT                                                                                                                                                              

      7654 MARTIN           1250 PRESIDENT                                                                                                                                                              

      7698 BLAKE            2850 PRESIDENT                                                                                                                                                              

      7782 CLARK            2450 PRESIDENT                                                                                                                                                              

      7788 SCOTT            3000 PRESIDENT                                                                                                                                                              

      7839 KING             5000 PRESIDENT                                                                                                                                                              

      7844 TURNER           1500 PRESIDENT                                                                                                                                                              

      7876 ADAMS            1100 PRESIDENT                                                                                                                                                              

 

     EMPNO ENAME             SAL 四列                                                                                                                                                                 

---------- ---------- ---------- ---------                                                                                                                                                              

      7900 JAMES             950 PRESIDENT                                                                                                                                                              

      7902 FORD             3000 PRESIDENT                                                                                                                                                              

      7934 MILLER           1300 PRESIDENT                                                                                                                                                              

 

已选择 14 行。

 

SQL> --5、强调from后面的子查询

SQL> --查询员工信息:员工号 姓名  月薪

SQL> select *

  2  from (select empno,ename,sal from emp);

 

     EMPNO ENAME             SAL                                                                                                                                                                        

---------- ---------- ----------                                                                                                                                                                        

      7369 SMITH             800                                                                                                                                                                        

      7499 ALLEN            1600                                                                                                                                                                        

      7521 WARD             1250                                                                                                                                                                        

      7566 JONES            2975                                                                                                                                                                        

      7654 MARTIN           1250                                                                                                                                                                        

      7698 BLAKE            2850                                                                                                                                                                        

      7782 CLARK            2450                                                                                                                                                                        

      7788 SCOTT            3000                                                                                                                                                                        

      7839 KING             5000                                                                                                                                                                        

      7844 TURNER           1500                                                                                                                                                                        

      7876 ADAMS            1100                                                                                                                                                                        

 

     EMPNO ENAME             SAL                                                                                                                                                                        

---------- ---------- ----------                                                                                                                                                                        

      7900 JAMES             950                                                                                                                                                                        

      7902 FORD             3000                                                                                                                                                                        

      7934 MILLER           1300                                                                                                                                                                        

 

已选择 14 行。

 

SQL> --查询员工信息:员工号 姓名  月薪 年薪

SQL> ed

已写入 file afiedt.buf

 

  1  select *

  2* from (select empno,ename,sal,sal*12 annsal from emp)

SQL> /

 

     EMPNO ENAME             SAL     ANNSAL                                                                                                                                                             

---------- ---------- ---------- ----------                                                                                                                                                             

      7369 SMITH             800       9600                                                                                                                                                             

      7499 ALLEN            1600      19200                                                                                                                                                             

      7521 WARD             1250      15000                                                                                                                                                             

      7566 JONES            2975      35700                                                                                                                                                             

      7654 MARTIN           1250      15000                                                                                                                                                             

      7698 BLAKE            2850      34200                                                                                                                                                             

      7782 CLARK            2450      29400                                                                                                                                                             

      7788 SCOTT            3000      36000                                                                                                                                                             

      7839 KING             5000      60000                                                                                                                                                             

      7844 TURNER           1500      18000                                                                                                                                                             

      7876 ADAMS            1100      13200                                                                                                                                                             

 

     EMPNO ENAME             SAL     ANNSAL                                                                                                                                                             

---------- ---------- ---------- ----------                                                                                                                                                             

      7900 JAMES             950      11400                                                                                                                                                             

      7902 FORD             3000      36000                                                                                                                                                             

      7934 MILLER           1300      15600                                                                                                                                                             

 

已选择 14 行。

 

SQL> --6、主查询和子查询可以不是同一张表;只有子查询返回的结果 主查询可以使用 即可

SQL> --查询部门名称是SALES的员工

SQL> select *

  2  from emp

  3  where deptno=(select deptno from dept where dname='SALES');

 

     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO                                                                                                              

---------- ---------- --------- ---------- -------------- ---------- ---------- ----------                                                                                                              

      7499 ALLEN      SALESMAN        7698 20-2-81           1600        300         30                                                                                                              

      7521 WARD       SALESMAN        7698 22-2-81           1250        500         30                                                                                                              

      7654 MARTIN     SALESMAN        7698 28-9-81           1250       1400         30                                                                                                              

      7698 BLAKE      MANAGER         7839 01-5-81           2850                    30                                                                                                              

      7844 TURNER     SALESMAN        7698 08-9-81           1500          0         30                                                                                                              

      7900 JAMES      CLERK           7698 03-12-81            950                    30                                                                                                              

 

已选择 6 行。

 

SQL> select e.*

  2  from emp e,dept d

  3  where e.deptno=d.deptno and d.dname='SALES';

 

     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO                                                                                                              

---------- ---------- --------- ---------- -------------- ---------- ---------- ----------                                                                                                              

      7499 ALLEN      SALESMAN        7698 20-2-81           1600        300         30                                                                                                              

      7521 WARD       SALESMAN        7698 22-2-81           1250        500         30                                                                                                              

      7654 MARTIN     SALESMAN        7698 28-9-81           1250       1400         30                                                                                                              

      7698 BLAKE      MANAGER         7839 01-5-81           2850                    30                                                                                                              

      7844 TURNER     SALESMAN        7698 08-9-81           1500          0         30                                                                                                              

      7900 JAMES      CLERK           7698 03-12-81            950                    30                                                                                                              

 

已选择 6 行。

 

SQL> --SQL优化 3、尽量使用多表查询

SQL> --SQL执行计划

SQL> host cls

 

SQL> --in 在集合中

SQL> --查询部门名称是SALES和ACCOUNTING的员工

SQL> select *

  2  from emp

  3  where deptno in (select deptno from dept where dname='SALES' or dname='ACCOUNTING');

 

     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO                                                                                                              

---------- ---------- --------- ---------- -------------- ---------- ---------- ----------                                                                                                              

      7499 ALLEN      SALESMAN        7698 20-2-81           1600        300         30                                                                                                              

      7521 WARD       SALESMAN        7698 22-2-81           1250        500         30                                                                                                              

      7654 MARTIN     SALESMAN        7698 28-9-81           1250       1400         30                                                                                                              

      7698 BLAKE      MANAGER         7839 01-5-81           2850                    30                                                                                                              

      7782 CLARK      MANAGER         7839 09-6-81           2450                    10                                                                                                              

      7839 KING       PRESIDENT            17-11-81           5000                    10                                                                                                              

      7844 TURNER     SALESMAN        7698 08-9-81           1500          0         30                                                                                                              

      7900 JAMES      CLERK           7698 03-12-81            950                    30                                                                                                              

      7934 MILLER     CLERK           7782 23-1-82           1300                    10                                                                                                              

 

已选择 9 行。

 

SQL> select e.*

  2  from emp e,dept d

  3  where e.deptno=d.deptno and (d.dname='SALES' or d.dname='ACCOUNTING');

 

     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO                                                                                                              

---------- ---------- --------- ---------- -------------- ---------- ---------- ----------                                                                                                              

      7499 ALLEN      SALESMAN        7698 20-2-81           1600        300         30                                                                                                              

      7521 WARD       SALESMAN        7698 22-2-81           1250        500         30                                                                                                              

      7654 MARTIN     SALESMAN        7698 28-9-81           1250       1400         30                                                                                                              

      7698 BLAKE      MANAGER         7839 01-5-81           2850                    30                                                                                                              

      7782 CLARK      MANAGER         7839 09-6-81           2450                    10                                                                                                              

      7839 KING       PRESIDENT            17-11-81           5000                    10                                                                                                              

      7844 TURNER     SALESMAN        7698 08-9-81           1500          0         30                                                                                                              

      7900 JAMES      CLERK           7698 03-12-81            950                    30                                                                                                              

      7934 MILLER     CLERK           7782 23-1-82           1300                    10                                                                                                              

 

已选择 9 行。

 

SQL> --any: 和集合中的任意一个值比较

SQL> --查询工资比30号部门任意一个员工高的员工信息

SQL> select *

  2  from emp

  3  where sal > any (select sal from emp where deptno=30);

 

     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO                                                                                                              

---------- ---------- --------- ---------- -------------- ---------- ---------- ----------                                                                                                              

      7839 KING       PRESIDENT            17-11-81           5000                    10                                                                                                              

      7902 FORD       ANALYST         7566 03-12-81           3000                    20                                                                                                              

      7788 SCOTT      ANALYST         7566 19-4-87           3000                    20                                                                                                              

      7566 JONES      MANAGER         7839 02-4-81           2975                    20                                                                                                              

      7698 BLAKE      MANAGER         7839 01-5-81           2850                    30                                                                                                              

      7782 CLARK      MANAGER         7839 09-6-81           2450                    10                                                                                                              

      7499 ALLEN      SALESMAN        7698 20-2-81           1600        300         30                                                                                                              

      7844 TURNER     SALESMAN        7698 08-9-81           1500          0         30                                                                                                              

      7934 MILLER     CLERK           7782 23-1-82           1300                    10                                                                                                              

      7521 WARD       SALESMAN        7698 22-2-81           1250        500         30                                                                                                              

      7654 MARTIN     SALESMAN        7698 28-9-81           1250       1400         30                                                                                                              

 

     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO                                                                                                              

---------- ---------- --------- ---------- -------------- ---------- ---------- ----------                                                                                                              

      7876 ADAMS      CLERK           7788 23-5-87           1100                    20                                                                                                              

 

已选择 12 行。

 

SQL> ed

已写入 file afiedt.buf

 

  1  select *

  2  from emp

  3* where sal > (select min(sal) from emp where deptno=30)

SQL> /

 

     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO                                                                                                              

---------- ---------- --------- ---------- -------------- ---------- ---------- ----------                                                                                                              

      7499 ALLEN      SALESMAN        7698 20-2-81           1600        300         30                                                                                                              

      7521 WARD       SALESMAN        7698 22-2-81           1250        500         30                                                                                                              

      7566 JONES      MANAGER         7839 02-4-81           2975                    20                                                                                                              

      7654 MARTIN     SALESMAN        7698 28-9-81           1250       1400         30                                                                                                              

      7698 BLAKE      MANAGER         7839 01-5-81           2850                    30                                                                                                              

      7782 CLARK      MANAGER         7839 09-6-81           2450                    10                                                                                                              

      7788 SCOTT      ANALYST         7566 19-4-87           3000                    20                                                                                                              

      7839 KING       PRESIDENT            17-11-81           5000                    10                                                                                                              

      7844 TURNER     SALESMAN        7698 08-9-81           1500          0         30                                                                                                              

      7876 ADAMS      CLERK           7788 23-5-87           1100                    20                                                                                                              

      7902 FORD       ANALYST         7566 03-12-81           3000                    20                                                                                                              

 

     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO                                                                                                              

---------- ---------- --------- ---------- -------------- ---------- ---------- ----------                                                                                                              

      7934 MILLER     CLERK           7782 23-1-82           1300                    10                                                                                                              

 

已选择 12 行。

 

SQL>  --all:和集合中的所有值比较

SQL> --查询工资比30号部门所有员工高的员工信息

SQL> select *

  2  from emp

  3  where sal > all (select sal from emp where deptno=30);

 

     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO                                                                                                              

---------- ---------- --------- ---------- -------------- ---------- ---------- ----------                                                                                                              

      7566 JONES      MANAGER         7839 02-4-81           2975                    20                                                                                                              

      7788 SCOTT      ANALYST         7566 19-4-87           3000                    20                                                                                                              

      7839 KING       PRESIDENT            17-11-81           5000                    10                                                                                                              

      7902 FORD       ANALYST         7566 03-12-81           3000                    20                                                                                                              

 

SQL> ed

已写入 file afiedt.buf

 

  1  select *

  2  from emp

  3* where sal > (select max(sal) from emp where deptno=30)

SQL> /

 

     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO                                                                                                              

---------- ---------- --------- ---------- -------------- ---------- ---------- ----------                                                                                                              

      7566 JONES      MANAGER         7839 02-4-81           2975                    20                                                                                                              

      7788 SCOTT      ANALYST         7566 19-4-87           3000                    20                                                                                                              

      7839 KING       PRESIDENT            17-11-81           5000                    10                                                                                                              

      7902 FORD       ANALYST         7566 03-12-81           3000                    20                                                                                                              

 

SQL> host cls

 

SQL> -多行子查询null

SP2-0734: 知的令开头 "-多行子查..." - 忽略了剩余的行。

SQL> --多行子查询中的null

SQL> --查询不是老板的员工信息

SQL> select * from emp;

 

     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO                                                                                                              

---------- ---------- --------- ---------- -------------- ---------- ---------- ----------                                                                                                              

      7369 SMITH      CLERK           7902 17-12-80            800                    20                                                                                                              

      7499 ALLEN      SALESMAN        7698 20-2-81           1600        300         30                                                                                                              

      7521 WARD       SALESMAN        7698 22-2-81           1250        500         30                                                                                                              

      7566 JONES      MANAGER         7839 02-4-81           2975                    20                                                                                                              

      7654 MARTIN     SALESMAN        7698 28-9-81           1250       1400         30                                                                                                              

      7698 BLAKE      MANAGER         7839 01-5-81           2850                    30                                                                                                              

      7782 CLARK      MANAGER         7839 09-6-81           2450                    10                                                                                                              

      7788 SCOTT      ANALYST         7566 19-4-87           3000                    20                                                                                                              

      7839 KING       PRESIDENT            17-11-81           5000                    10                                                                                                              

      7844 TURNER     SALESMAN        7698 08-9-81           1500          0         30                                                                                                              

      7876 ADAMS      CLERK           7788 23-5-87           1100                    20                                                                                                              

 

     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO                                                                                                              

---------- ---------- --------- ---------- -------------- ---------- ---------- ----------                                                                                                              

      7900 JAMES      CLERK           7698 03-12-81            950                    30                                                                                                              

      7902 FORD       ANALYST         7566 03-12-81           3000                    20                                                                                                              

      7934 MILLER     CLERK           7782 23-1-82           1300                    10                                                                                                              

 

已选择 14 行。

 

SQL> select *

  2  from emp

  3  where empno not in (select mgr from emp);

 

选定行

 

SQL> --查询是老板的员工信息

SQL> ed

已写入 file afiedt.buf

 

  1  select *

  2  from emp

  3* where empno in (select mgr from emp)

SQL> /

 

     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO                                                                                                              

---------- ---------- --------- ---------- -------------- ---------- ---------- ----------                                                                                                              

      7902 FORD       ANALYST         7566 03-12-81           3000                    20                                                                                                              

      7698 BLAKE      MANAGER         7839 01-5-81           2850                    30                                                                                                              

      7839 KING       PRESIDENT            17-11-81           5000                    10                                                                                                              

      7566 JONES      MANAGER         7839 02-4-81           2975                    20                                                                                                              

      7788 SCOTT      ANALYST         7566 19-4-87           3000                    20                                                                                                              

      7782 CLARK      MANAGER         7839 09-6-81           2450                    10                                                                                                              

 

已选择 6 行。

 

SQL> select *

  2  from emp

  3  where empno not in (select mgr from emp where mgr is not null);

 

     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO                                                                                                              

---------- ---------- --------- ---------- -------------- ---------- ---------- ----------                                                                                                              

      7844 TURNER     SALESMAN        7698 08-9-81           1500          0         30                                                                                                              

      7521 WARD       SALESMAN        7698 22-2-81           1250        500         30                                                                                                              

      7654 MARTIN     SALESMAN        7698 28-9-81           1250       1400         30                                                                                                              

      7499 ALLEN      SALESMAN        7698 20-2-81           1600        300         30                                                                                                              

      7934 MILLER     CLERK           7782 23-1-82           1300                    10                                                                                                              

      7369 SMITH      CLERK           7902 17-12-80            800                    20                                                                                                              

      7876 ADAMS      CLERK           7788 23-5-87           1100                    20                                                                                                              

      7900 JAMES      CLERK           7698 03-12-81            950                    30                                                                                                              

 

已选择 8 行。

 

SQL> spool off

 

猜你喜欢

转载自blog.csdn.net/Angel_guoo/article/details/84953088
今日推荐