Oracle数据库(六)子查询

SQL> --查询工资比SCOTT高的员工信息
SQL> --1. SCOTT的工资
SQL> select sal from emp where ename='SCOTT';

       SAL                                                                      
----------                                                                      
      3000                                                                      

SQL> --2. 比3000高的员工
SQL> set linesize 200
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> 注意的问题:
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,若子查询的结果中含有null值,则不能使用not in来判断,可以使用in判断
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
  4                from dept
  5                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优化 4: 理论上,尽量使用多表查询
SQL> host cls

SQL> --in 在集合中
SQL> --查询部门名称是SALES和ACCOUNTING的员工
SQL> select *
  2  from emp
  3  where deptno in (select deptno frmo dept where dname='SALES' or dname='ACCOUNTING');
where deptno in (select deptno frmo dept where dname='SALES' or dname='ACCOUNTING')
                                    *
第 3 行出现错误: 
ORA-00923: 未找到要求的 FROM 关键字 


SQL> ed
已写入 file afiedt.buf

  1  select *
  2  from emp
  3* where deptno in (select deptno from dept where dname='SALES' or dname='ACCOUNTING')
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                                                                                                              
      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> host cls

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
SQL> --not in (10,20,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

SQL> --rownum 伪列 行号
SQL> select rownum,empno,ename,sal from emp;

    ROWNUM      EMPNO ENAME             SAL                                                                                                                                                             
---------- ---------- ---------- ----------                                                                                                                                                             
         1       7369 SMITH             800                                                                                                                                                             
         2       7499 ALLEN            1600                                                                                                                                                             
         3       7521 WARD             1250                                                                                                                                                             
         4       7566 JONES            2975                                                                                                                                                             
         5       7654 MARTIN           1250                                                                                                                                                             
         6       7698 BLAKE            2850                                                                                                                                                             
         7       7782 CLARK            2450                                                                                                                                                             
         8       7788 SCOTT            3000                                                                                                                                                             
         9       7839 KING             5000                                                                                                                                                             
        10       7844 TURNER           1500                                                                                                                                                             
        11       7876 ADAMS            1100                                                                                                                                                             

    ROWNUM      EMPNO ENAME             SAL                                                                                                                                                             
---------- ---------- ---------- ----------                                                                                                                                                             
        12       7900 JAMES             950                                                                                                                                                             
        13       7902 FORD             3000                                                                                                                                                             
        14       7934 MILLER           1300                                                                                                                                                             

已选择 14 行。

SQL> select rownum,empno,ename,sal
  2  from emp
  3  where rownum<=3
  4  order by sal desc;

    ROWNUM      EMPNO ENAME             SAL                                                                                                                                                             
---------- ---------- ---------- ----------                                                                                                                                                             
         2       7499 ALLEN            1600                                                                                                                                                             
         3       7521 WARD             1250                                                                                                                                                             
         1       7369 SMITH             800                                                                                                                                                             

SQL> /*
SQL> 关于rownum
SQL> 1. rownum永远按照默认的顺序生成
SQL> 2. rownum只能使用< <=;不能使用> >=
SQL> */
SQL>  select rownum,empno,ename,sal from emp order by sal desc;

    ROWNUM      EMPNO ENAME             SAL                                                                                                                                                             
---------- ---------- ---------- ----------                                                                                                                                                             
         9       7839 KING             5000                                                                                                                                                             
        13       7902 FORD             3000                                                                                                                                                             
         8       7788 SCOTT            3000                                                                                                                                                             
         4       7566 JONES            2975                                                                                                                                                             
         6       7698 BLAKE            2850                                                                                                                                                             
         7       7782 CLARK            2450                                                                                                                                                             
         2       7499 ALLEN            1600                                                                                                                                                             
        10       7844 TURNER           1500                                                                                                                                                             
        14       7934 MILLER           1300                                                                                                                                                             
         3       7521 WARD             1250                                                                                                                                                             
         5       7654 MARTIN           1250                                                                                                                                                             

    ROWNUM      EMPNO ENAME             SAL                                                                                                                                                             
---------- ---------- ---------- ----------                                                                                                                                                             
        11       7876 ADAMS            1100                                                                                                                                                             
        12       7900 JAMES             950                                                                                                                                                             
         1       7369 SMITH             800                                                                                                                                                             

已选择 14 行。

SQL> select rownum,empno,ename,sal
  2  from (select * from emp order by sal desc)
  3  where rownum<=3;

    ROWNUM      EMPNO ENAME             SAL                                                                                                                                                             
---------- ---------- ---------- ----------                                                                                                                                                             
         1       7839 KING             5000                                                                                                                                                             
         2       7788 SCOTT            3000                                                                                                                                                             
         3       7902 FORD             3000                                                                                                                                                             

SQL> -- 2. rownum只能使用< <=;不能使用> >=
SQL> select rownum,empno,ename,sal from emp where rownum>=5 and rownum<=8;

未选定行

SQL> select rownum,empno,ename,sal from emp where rownum>=5;

未选定行

SQL> select rownum,empno,ename,sal from emp where rownum<=8;

    ROWNUM      EMPNO ENAME             SAL                                                                                                                                                             
---------- ---------- ---------- ----------                                                                                                                                                             
         1       7369 SMITH             800                                                                                                                                                             
         2       7499 ALLEN            1600                                                                                                                                                             
         3       7521 WARD             1250                                                                                                                                                             
         4       7566 JONES            2975                                                                                                                                                             
         5       7654 MARTIN           1250                                                                                                                                                             
         6       7698 BLAKE            2850                                                                                                                                                             
         7       7782 CLARK            2450                                                                                                                                                             
         8       7788 SCOTT            3000                                                                                                                                                             

已选择 8 行。

SQL>  select *
  2   from 	(select rownum r,e1.*
  3  	 from (select * from emp order by sal) e1
  4   	 where rownum <=8
  5  	)
  6   where r >=5;

         R      EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO                                                                                                   
---------- ---------- ---------- --------- ---------- -------------- ---------- ---------- ----------                                                                                                   
         5       7654 MARTIN     SALESMAN        7698 28-9月 -81           1250       1400         30                                                                                                   
         6       7934 MILLER     CLERK           7782 23-1月 -82           1300                    10                                                                                                   
         7       7844 TURNER     SALESMAN        7698 08-9月 -81           1500          0         30                                                                                                   
         8       7499 ALLEN      SALESMAN        7698 20-2月 -81           1600        300         30                                                                                                   

SQL> --临时表
SQL> --create global temporary table ******
SQL> --特点:当事务或者会话结束的时候,表中的数据自动删除
SQL> create global temporary table test1
  2  (tid number,
  3   tname varchar2(20))
  4  on commit delete rows;

表已创建。

SQL> insert into test1 values(1,'Tom');

已创建 1 行。

SQL> select * from test1;

       TID TNAME                                                                                                                                                                                        
---------- --------------------                                                                                                                                                                         
         1 Tom                                                                                                                                                                                          

SQL> commit;

提交完成。

SQL> select * from test1;

未选定行

SQL> 
SQL> create global temporary table test2
  2  (tid number,
  3   tname varchar2(20))
  4  on commit reserve rows;
on commit reserve rows
          *
第 4 行出现错误: 
ORA-00901: 无效 CREATE 命令 


SQL> create global temporary table test2
  2  (tid number,
  3   tname varchar2(20))
  4  on commit preserve rows;

表已创建。

SQL> insert into test2 values(1,'Tom');

已创建 1 行。

SQL> commit;

提交完成。

SQL> select * from test2;

       TID TNAME                                                                                                                                                                                        
---------- --------------------                                                                                                                                                                         
         1 Tom                                                                                                                                                                                          

SQL> exit
SQL> host cls

SQL> --第二题
SQL> select e.empno,e.ename,e.sal,d.avgsal
  2  from emp e, (select deptno,avg(sal) avgsal from emp group by deptno) d
  3  where e.deptno=d.deptno and e.sal> d.avgsal;

     EMPNO ENAME             SAL     AVGSAL                                     
---------- ---------- ---------- ----------                                     
      7698 BLAKE            2850 1566.66667                                     
      7499 ALLEN            1600 1566.66667                                     
      7902 FORD             3000       2175                                     
      7788 SCOTT            3000       2175                                     
      7566 JONES            2975       2175                                     
      7839 KING             5000 2916.66667                                     

已选择 6 行。

SQL> --相关子查询:将主查询的值作为参数传递给子查询
SQL> select empno,ename,sal,(select avg(sal) from emp where deptno=e.deptno) avgsal
  2  from emp e
  3  where sal > (select avg(sal) from emp where deptno=e.deptno);

     EMPNO ENAME             SAL     AVGSAL                                     
---------- ---------- ---------- ----------                                     
      7499 ALLEN            1600 1566.66667                                     
      7566 JONES            2975       2175                                     
      7698 BLAKE            2850 1566.66667                                     
      7788 SCOTT            3000       2175                                     
      7839 KING             5000 2916.66667                                     
      7902 FORD             3000       2175                                     

已选择 6 行。

SQL> host cls

SQL> --第三题
SQL> select hiredate from emp;

HIREDATE                                                                        
--------------                                                                  
17-12月-80                                                                      
20-2月 -81                                                                      
22-2月 -81                                                                      
02-4月 -81                                                                      
28-9月 -81                                                                      
01-5月 -81                                                                      
09-6月 -81                                                                      
19-4月 -87                                                                      
17-11月-81                                                                      
08-9月 -81                                                                      
23-5月 -87                                                                      

HIREDATE                                                                        
--------------                                                                  
03-12月-81                                                                      
03-12月-81                                                                      
23-1月 -82                                                                      

已选择 14 行。

SQL> /*
SQL> select count(*) Total,
SQL> 
SQL>        sum(if 是81年 then +1 else +0) "1981",
SQL> from emp;
SQL> 
SQL> HIREDATE       count81:=0
SQL> --------------------------
SQL> 17-12月-80           0
SQL> 20-2月 -81           1
SQL> 22-2月 -81           1
SQL> 02-4月 -81           1
SQL> 28-9月 -81           1
SQL> 01-5月 -81           1
SQL> 09-6月 -81           1
SQL> 19-4月 -87           0
SQL> 17-11月-81           1
SQL> 08-9月 -81           1
SQL> 23-5月 -87           0
SQL> 03-12月-81           1
SQL> 03-12月-81           1
SQL> 23-1月 -82           0
SQL> -----------------------------
SQL>                     10
SQL> */
SQL> host cls

SQL> --行转列
SQL> -- wm_concat(字符串)  组函数
SQL> select deptno,wm_concat(ename) nameslist
  2  from emp
  3  group by deptno;

    DEPTNO                                                                      
----------                                                                      
NAMESLIST                                                                       
--------------------------------------------------------------------------------
        10                                                                      
CLARK,KING,MILLER                                                               
                                                                                
        20                                                                      
SMITH,FORD,ADAMS,SCOTT,JONES                                                    
                                                                                
        30                                                                      
ALLEN,BLAKE,MARTIN,TURNER,JAMES,WARD                                            
                                                                                

SQL> col NAMESLIST for a60
SQL> select deptno,wm_concat(ename) nameslist
  2  from emp
  3  group by deptno;

    DEPTNO NAMESLIST                                                            
---------- ------------------------------------------------------------         
        10 CLARK,KING,MILLER                                                    
        20 SMITH,FORD,ADAMS,SCOTT,JONES                                         
        30 ALLEN,BLAKE,MARTIN,TURNER,JAMES,WARD                                 

SQL> spool off

 --oracle分页

 select *
 from 	(select rownum r,e1.*
	 from (select * from emp order by sal) e1
 	 where rownum <=8
	)
 where r >=5;

SQL> select count(*) Total,
  2         sum(decode(to_char(hiredate,'yyyy'),'1980',1,0)) "1980",
  3         sum(decode(to_char(hiredate,'yyyy'),'1981',1,0)) "1981",
  4         sum(decode(to_char(hiredate,'yyyy'),'1982',1,0)) "1982",
  5         sum(decode(to_char(hiredate,'yyyy'),'1987',1,0)) "1987"
  6  from emp;

     TOTAL       1980       1981       1982       1987                          
---------- ---------- ---------- ---------- ----------                          
        14          1         10          1          2        

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值