• Oracle02——oracle分页、子查询、集合运算、处理数据、创建和管理表和其他数据库对象


    作者: kent鹏  

    转载请注明出处: http://www.cnblogs.com/xieyupeng/p/7289451.html 

     --oracle分页(Pageing Query)
    
     select *
     from     (select rownum r,e1.*
         from (select * from emp order by sal) e1
          where rownum <=8
        )
     where r >=5;
    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
    子查询
    SQL> /*
    SQL> 查询10和20号部门的员工
    SQL> 1. select * from emp where deptno=10 or deptno=20;
    SQL> 2. select * from emp where deptno in (10,20);
    SQL> 3. 集合运算
    SQL>     select * from emp where deptno=10
    SQL>       加上
    SQL>     select * from emp where deptno=20
    SQL> */
    SQL> select * from emp where deptno=10
      2  union
      3  select * from emp where deptno=20;
    
         EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO                                                                                                              
    ---------- ---------- --------- ---------- -------------- ---------- ---------- ----------                                                                                                              
          7369 SMITH      CLERK           7902 17-12月-80            800                    20                                                                                                              
          7566 JONES      MANAGER         7839 02-4月 -81           2975                    20                                                                                                              
          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                                                                                                              
          7876 ADAMS      CLERK           7788 23-5月 -87           1100                    20                                                                                                              
          7902 FORD       ANALYST         7566 03-12月-81           3000                    20                                                                                                              
          7934 MILLER     CLERK           7782 23-1月 -82           1300                    10                                                                                                              
    
    已选择 8 行。
    
    SQL>  select deptno,job,sum(sal) from emp group by rollup(deptno,job);
    
        DEPTNO JOB         SUM(SAL)                                                                                                                                                                         
    ---------- --------- ----------                                                                                                                                                                         
            10 CLERK           1300                                                                                                                                                                         
            10 MANAGER         2450                                                                                                                                                                         
            10 PRESIDENT       5000                                                                                                                                                                         
            10                 8750                                                                                                                                                                         
            20 CLERK           1900                                                                                                                                                                         
            20 ANALYST         6000                                                                                                                                                                         
            20 MANAGER         2975                                                                                                                                                                         
            20                10875                                                                                                                                                                         
            30 CLERK            950                                                                                                                                                                         
            30 MANAGER         2850                                                                                                                                                                         
            30 SALESMAN        5600                                                                                                                                                                         
    
        DEPTNO JOB         SUM(SAL)                                                                                                                                                                         
    ---------- --------- ----------                                                                                                                                                                         
            30                 9400                                                                                                                                                                         
                              29025                                                                                                                                                                         
    
    已选择 13 行。
    
    SQL>  select deptno,job,sum(sal) from emp group by deptno,job
      2   union
      3   select deptno,sum(sal) from emp group by deptno
      4   union
      5   select sum(sal) from emp;
     select deptno,sum(sal) from emp group by deptno
     *3 行出现错误: 
    ORA-01789: 查询块具有不正确的结果列数 
    
    
    SQL> /*
    SQL> 注意的问题:
    SQL> 1、参与运算的各个集合必须列数相同 且类型一致
    SQL> 2、采用第一个集合作为最后的表头
    SQL> 3、order by永远在最后
    SQL> 4、括号
    SQL> */
    SQL>  select deptno,job,sum(sal) from emp group by deptno,job
      2   union
      3   select deptno,to_char(null),sum(sal) from emp group by deptno
      4   union
      5   select to_number(null),to_char(null),sum(sal) from emp;
    
        DEPTNO JOB         SUM(SAL)                                                                                                                                                                         
    ---------- --------- ----------                                                                                                                                                                         
            10 CLERK           1300                                                                                                                                                                         
            10 MANAGER         2450                                                                                                                                                                         
            10 PRESIDENT       5000                                                                                                                                                                         
            10                 8750                                                                                                                                                                         
            20 ANALYST         6000                                                                                                                                                                         
            20 CLERK           1900                                                                                                                                                                         
            20 MANAGER         2975                                                                                                                                                                         
            20                10875                                                                                                                                                                         
            30 CLERK            950                                                                                                                                                                         
            30 MANAGER         2850                                                                                                                                                                         
            30 SALESMAN        5600                                                                                                                                                                         
    
        DEPTNO JOB         SUM(SAL)                                                                                                                                                                         
    ---------- --------- ----------                                                                                                                                                                         
            30                 9400                                                                                                                                                                         
                              29025                                                                                                                                                                         
    
    已选择 13 行。
    
    SQL> --break on deptno skip 2
    SQL> host cls
    
    SQL> --SQL 执行的时间
    SQL> 
    SQL> set timing on
    SQL>  select deptno,job,sum(sal) from emp group by rollup(deptno,job);
    
        DEPTNO JOB         SUM(SAL)                                                                                                                                                                         
    ---------- --------- ----------                                                                                                                                                                         
            10 CLERK           1300                                                                                                                                                                         
            10 MANAGER         2450                                                                                                                                                                         
            10 PRESIDENT       5000                                                                                                                                                                         
            10                 8750                                                                                                                                                                         
            20 CLERK           1900                                                                                                                                                                         
            20 ANALYST         6000                                                                                                                                                                         
            20 MANAGER         2975                                                                                                                                                                         
            20                10875                                                                                                                                                                         
            30 CLERK            950                                                                                                                                                                         
            30 MANAGER         2850                                                                                                                                                                         
            30 SALESMAN        5600                                                                                                                                                                         
    
        DEPTNO JOB         SUM(SAL)                                                                                                                                                                         
    ---------- --------- ----------                                                                                                                                                                         
            30                 9400                                                                                                                                                                         
                              29025                                                                                                                                                                         
    
    已选择 13 行。
    
    已用时间:  00: 00: 00.01
    SQL>  select deptno,job,sum(sal) from emp group by deptno,job
      2   union
      3   select deptno,to_char(null),sum(sal) from emp group by deptno
      4   union
      5   select to_number(null),to_char(null),sum(sal) from emp;
    
        DEPTNO JOB         SUM(SAL)                                                                                                                                                                         
    ---------- --------- ----------                                                                                                                                                                         
            10 CLERK           1300                                                                                                                                                                         
            10 MANAGER         2450                                                                                                                                                                         
            10 PRESIDENT       5000                                                                                                                                                                         
            10                 8750                                                                                                                                                                         
            20 ANALYST         6000                                                                                                                                                                         
            20 CLERK           1900                                                                                                                                                                         
            20 MANAGER         2975                                                                                                                                                                         
            20                10875                                                                                                                                                                         
            30 CLERK            950                                                                                                                                                                         
            30 MANAGER         2850                                                                                                                                                                         
            30 SALESMAN        5600                                                                                                                                                                         
    
        DEPTNO JOB         SUM(SAL)                                                                                                                                                                         
    ---------- --------- ----------                                                                                                                                                                         
            30                 9400                                                                                                                                                                         
                              29025                                                                                                                                                                         
    
    已选择 13 行。
    
    已用时间:  00: 00: 00.01
    SQL>  select deptno,job,sum(sal) from emp group by deptno,job
      2   union
      3   select deptno,to_char(null),sum(sal) from emp group by deptno
      4   union
      5   select to_number(null),to_char(null),sum(sal) from emp;
    
        DEPTNO JOB         SUM(SAL)                                                                                                                                                                         
    ---------- --------- ----------                                                                                                                                                                         
            10 CLERK           1300                                                                                                                                                                         
            10 MANAGER         2450                                                                                                                                                                         
            10 PRESIDENT       5000                                                                                                                                                                         
            10                 8750                                                                                                                                                                         
            20 ANALYST         6000                                                                                                                                                                         
            20 CLERK           1900                                                                                                                                                                         
            20 MANAGER         2975                                                                                                                                                                         
            20                10875                                                                                                                                                                         
            30 CLERK            950                                                                                                                                                                         
            30 MANAGER         2850                                                                                                                                                                         
            30 SALESMAN        5600                                                                                                                                                                         
    
        DEPTNO JOB         SUM(SAL)                                                                                                                                                                         
    ---------- --------- ----------                                                                                                                                                                         
            30                 9400                                                                                                                                                                         
                              29025                                                                                                                                                                         
    
    已选择 13 行。
    
    已用时间:  00: 00: 00.03
    SQL> --SQL优化 4、 尽量不要使用集合运算
    SQL> set timing off
    SQL> spool off
    集合运算

    碎片

    SQL> /*
    SQL> SQL的类型
    SQL> 1、DML(Data Manipulation Language 数据操作语言): select insert update delete
    SQL> 2、DDL(Data Definition Language 数据定义语言): create table,alter table,truncate table,drop table
    SQL>                                                create/drop view,sequnece,index,synonym(同义词)
    SQL> 3、DCL(Data Control Language 数据控制语言): grant(授权) revoke(撤销权限)
    SQL> */
    SQL> --插入insert
    SQL> insert into emp(empno,ename,sal,deptno) values(1001,'Tom',3000,10);
    
    已创建 1 行。
    
    SQL> --PreparedStatement pst = "insert into emp(empno,ename,sal,deptno) values(?,?,?,?)";
    SQL> --地址符 &
    SQL> insert into emp(empno,ename,sal,deptno) values(&empno,&ename,&sal,&deptno);
    输入 empno 的值:  1002
    输入 ename 的值:  'Mary'
    输入 sal 的值:  2000
    输入 deptno 的值:  20
    原值    1: insert into emp(empno,ename,sal,deptno) values(&empno,&ename,&sal,&deptno)
    新值    1: insert into emp(empno,ename,sal,deptno) values(1002,'Mary',2000,20)
    
    已创建 1 行。
    
    SQL> /
    输入 empno 的值:  1003
    输入 ename 的值:  'Mike'
    输入 sal 的值:  5000
    输入 deptno 的值:  10
    原值    1: insert into emp(empno,ename,sal,deptno) values(&empno,&ename,&sal,&deptno)
    新值    1: insert into emp(empno,ename,sal,deptno) values(1003,'Mike',5000,10)
    
    已创建 1 行。
    
    SQL> select empno,ename,sal,&t
      2  from emp;
    输入 t 的值:  job
    原值    1: select empno,ename,sal,&t
    新值    1: select empno,ename,sal,job
    
         EMPNO ENAME             SAL JOB                                                                                                                                                                    
    ---------- ---------- ---------- ---------                                                                                                                                                              
          1001 Tom              3000                                                                                                                                                                        
          1002 Mary             2000                                                                                                                                                                        
          1003 Mike             5000                                                                                                                                                                        
          7369 SMITH             800 CLERK                                                                                                                                                                  
          7499 ALLEN            1600 SALESMAN                                                                                                                                                               
          7521 WARD             1250 SALESMAN                                                                                                                                                               
          7566 JONES            2975 MANAGER                                                                                                                                                                
          7654 MARTIN           1250 SALESMAN                                                                                                                                                               
          7698 BLAKE            2850 MANAGER                                                                                                                                                                
          7782 CLARK            2450 MANAGER                                                                                                                                                                
          7788 SCOTT            3000 ANALYST                                                                                                                                                                
    
         EMPNO ENAME             SAL JOB                                                                                                                                                                    
    ---------- ---------- ---------- ---------                                                                                                                                                              
          7839 KING             5000 PRESIDENT                                                                                                                                                              
          7844 TURNER           1500 SALESMAN                                                                                                                                                               
          7876 ADAMS            1100 CLERK                                                                                                                                                                  
          7900 JAMES             950 CLERK                                                                                                                                                                  
          7902 FORD             3000 ANALYST                                                                                                                                                                
          7934 MILLER           1300 CLERK                                                                                                                                                                  
    
    已选择 17 行。
    
    SQL> /
    输入 t 的值:  sal
    原值    1: select empno,ename,sal,&t
    新值    1: select empno,ename,sal,sal
    
         EMPNO ENAME             SAL        SAL                                                                                                                                                             
    ---------- ---------- ---------- ----------                                                                                                                                                             
          1001 Tom              3000       3000                                                                                                                                                             
          1002 Mary             2000       2000                                                                                                                                                             
          1003 Mike             5000       5000                                                                                                                                                             
          7369 SMITH             800        800                                                                                                                                                             
          7499 ALLEN            1600       1600                                                                                                                                                             
          7521 WARD             1250       1250                                                                                                                                                             
          7566 JONES            2975       2975                                                                                                                                                             
          7654 MARTIN           1250       1250                                                                                                                                                             
          7698 BLAKE            2850       2850                                                                                                                                                             
          7782 CLARK            2450       2450                                                                                                                                                             
          7788 SCOTT            3000       3000                                                                                                                                                             
    
         EMPNO ENAME             SAL        SAL                                                                                                                                                             
    ---------- ---------- ---------- ----------                                                                                                                                                             
          7839 KING             5000       5000                                                                                                                                                             
          7844 TURNER           1500       1500                                                                                                                                                             
          7876 ADAMS            1100       1100                                                                                                                                                             
          7900 JAMES             950        950                                                                                                                                                             
          7902 FORD             3000       3000                                                                                                                                                             
          7934 MILLER           1300       1300                                                                                                                                                             
    
    已选择 17 行。
    
    SQL> select * from &t;
    输入 t 的值:  dept
    原值    1: select * from &t
    新值    1: select * from dept
    
        DEPTNO DNAME          LOC                                                                                                                                                                           
    ---------- -------------- -------------                                                                                                                                                                 
            10 ACCOUNTING     NEW YORK                                                                                                                                                                      
            20 RESEARCH       DALLAS                                                                                                                                                                        
            30 SALES          CHICAGO                                                                                                                                                                       
            40 OPERATIONS     BOSTON                                                                                                                                                                        
    
    SQL> rollback;
    
    回退已完成。
    
    SQL> host cls
    
    SQL> -一次插入多条记录
    SP2-0734: 未知的命令开头 "-一次插入..." - 忽略了剩余的行。
    SQL> --一次插入多条记录
    SQL> create table emp10 as select * from emp where 1=2;
    
    表已创建。
    
    SQL> desc emp10
     名称                                                                                                              是否为空? 类型
     ----------------------------------------------------------------------------------------------------------------- -------- ----------------------------------------------------------------------------
     EMPNO                                                                                                                      NUMBER(4)
     ENAME                                                                                                                      VARCHAR2(10)
     JOB                                                                                                                        VARCHAR2(9)
     MGR                                                                                                                        NUMBER(4)
     HIREDATE                                                                                                                   DATE
     SAL                                                                                                                        NUMBER(7,2)
     COMM                                                                                                                       NUMBER(7,2)
     DEPTNO                                                                                                                     NUMBER(2)
    
    SQL> select * from emp10;
    
    未选定行
    
    SQL> --一次性将emp中,所有10号部门的员工插入到emp10中
    SQL> insert into emp10 select * from emp where deptno=10;
    
    已创建 3 行。
    
    SQL> select * from emp10;
    
         EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO                                                                                                              
    ---------- ---------- --------- ---------- -------------- ---------- ---------- ----------                                                                                                              
          7782 CLARK      MANAGER         7839 09-6月 -81           2450                    10                                                                                                              
          7839 KING       PRESIDENT            17-11月-81           5000                    10                                                                                                              
          7934 MILLER     CLERK           7782 23-1月 -82           1300                    10                                                                                                              
    
    SQL> /*
    SQL> 海量插入数据:
    SQL> 1、数据泵(PLSQL程序)
    SQL>    dbms_datapump(程序包)
    SQL> 2、SQL*Loader
    SQL> 3、外部表
    SQL> */
    SQL> host cls
    
    SQL> /*
    SQL> delete和truncate的区别
    SQL> 1、delete逐条删除;truncate先摧毁表 再重建2
    SQL> 2、(*)delete是DML  truncate是DDL
    SQL>         (可以回滚)         (不可以回滚)
    SQL> 3、delete不会释放空间 truncate会
    SQL> 4、delete会产生碎片 truncate不会
    SQL> 5、delete可以闪回(flashback)  truncate不可以
    SQL> */
    SQL> --flashback其实是一种恢复
    SQL> set feedback off
    SQL> @d:temp	estdelete.sql
    SQL> select count(*) from testdelete;
    
      COUNT(*)                                                                                                                                                                                              
    ----------                                                                                                                                                                                              
          5000                                                                                                                                                                                              
    SQL> set timinig on
    SP2-0158: 未知的 SET 选项 "timinig"
    SQL> set timing on
    SQL> delete from testdelete;
    已用时间:  00: 00: 00.14
    SQL> set timing off
    SQL> drop table testdelete purge;
    SQL>  @d:temp	estdelete.sql
    SQL> set timing on
    SQL> truncate table testdelete;
    已用时间:  00: 00: 00.27
    SQL> set timing off
    SQL> --原因:(非常非常非常)undo数据(还原数据)
    SQL> host cls
    
    SQL> /*
    SQL> Oracle中的事务
    SQL> 1、起始标志: 事务中的第一条DML语句
    SQL> 2、结束标志:提交: 显式  commit  隐式: 正常退出 DDL DCL
    SQL>             回滚: 显式 rollback   隐式: 非正常退出 掉电  宕机
    SQL> */
    SQL> create table testsavepoint
      2  (tid number,tname varchar2(20));
    SQL> set feedback on
    SQL> insert into testsavepoint values(1,'Tom');
    
    已创建 1 行。
    
    SQL> insert into testsavepoint values(2,'Mary');
    
    已创建 1 行。
    
    SQL> savepoint a;
    
    保存点已创建。
    
    SQL> select * from testsavepoint;
    
           TID TNAME                                                                                                                                                                                        
    ---------- --------------------                                                                                                                                                                         
             1 Tom                                                                                                                                                                                          
             2 Mary                                                                                                                                                                                         
    
    已选择 2 行。
    
    SQL> insert into testsavepoint values(3,'Maee');
    
    已创建 1 行。
    
    SQL>  select * from testsavepoint;
    
           TID TNAME                                                                                                                                                                                        
    ---------- --------------------                                                                                                                                                                         
             1 Tom                                                                                                                                                                                          
             2 Mary                                                                                                                                                                                         
             3 Maee                                                                                                                                                                                         
    
    已选择 3 行。
    
    SQL> rollback to savepoint a;
    
    回退已完成。
    
    SQL> select * from testsavepoint;
    
           TID TNAME                                                                                                                                                                                        
    ---------- --------------------                                                                                                                                                                         
             1 Tom                                                                                                                                                                                          
             2 Mary                                                                                                                                                                                         
    
    已选择 2 行。
    
    SQL> commit;
    
    提交完成。
    
    SQL> set transaction read only;
    
    事务处理集。
    
    SQL> select * from testsavepoint;
    
           TID TNAME                                                                                                                                                                                        
    ---------- --------------------                                                                                                                                                                         
             1 Tom                                                                                                                                                                                          
             2 Mary                                                                                                                                                                                         
    
    已选择 2 行。
    
    SQL> insert into testsavepoint values(3,'Maee');
    insert into testsavepoint values(3,'Maee')
                *1 行出现错误: 
    ORA-01456: 不能在 READ ONLY 事务处理中执行插入/删除/更新操作 
    
    
    SQL> spool off
    处理数据
    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                                                                                                                                                  
    
    已选择 1 行。
    
    SQL> host cls
    
    SQL> --创建表
    SQL> create table test1
      2  (tid number,tname varchar2(20));
    
    表已创建。
    
    SQL> --rowid 行地址
    SQL> select rowid,empno,ename,sal from emp;
    
    ROWID                   EMPNO ENAME             SAL                                                                                                                                                     
    ------------------ ---------- ---------- ----------                                                                                                                                                     
    AAAMfPAAEAAAAAgAAA       7369 SMITH             800                                                                                                                                                     
    AAAMfPAAEAAAAAgAAB       7499 ALLEN            1600                                                                                                                                                     
    AAAMfPAAEAAAAAgAAC       7521 WARD             1250                                                                                                                                                     
    AAAMfPAAEAAAAAgAAD       7566 JONES            2975                                                                                                                                                     
    AAAMfPAAEAAAAAgAAE       7654 MARTIN           1250                                                                                                                                                     
    AAAMfPAAEAAAAAgAAF       7698 BLAKE            2850                                                                                                                                                     
    AAAMfPAAEAAAAAgAAG       7782 CLARK            2450                                                                                                                                                     
    AAAMfPAAEAAAAAgAAH       7788 SCOTT            3000                                                                                                                                                     
    AAAMfPAAEAAAAAgAAI       7839 KING             5000                                                                                                                                                     
    AAAMfPAAEAAAAAgAAJ       7844 TURNER           1500                                                                                                                                                     
    AAAMfPAAEAAAAAgAAK       7876 ADAMS            1100                                                                                                                                                     
    
    ROWID                   EMPNO ENAME             SAL                                                                                                                                                     
    ------------------ ---------- ---------- ----------                                                                                                                                                     
    AAAMfPAAEAAAAAgAAL       7900 JAMES             950                                                                                                                                                     
    AAAMfPAAEAAAAAgAAM       7902 FORD             3000                                                                                                                                                     
    AAAMfPAAEAAAAAgAAN       7934 MILLER           1300                                                                                                                                                     
    
    已选择 14 行。
    
    SQL> select * from emp where rowid='AAAMfPAAEAAAAAgAAJ';
    
         EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO                                                                                                              
    ---------- ---------- --------- ---------- -------------- ---------- ---------- ----------                                                                                                              
          7844 TURNER     SALESMAN        7698 08-9月 -81           1500          0         30                                                                                                              
    
    已选择 1 行。
    
    SQL> --创建表:保存20号部门的员工
    SQL> create table emp20
      2  as
      3  select * from emp where deptno=20;
    
    表已创建。
    
    SQL> select * from emp20;
    
         EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO                                                                                                              
    ---------- ---------- --------- ---------- -------------- ---------- ---------- ----------                                                                                                              
          7369 SMITH      CLERK           7902 17-12月-80            800                    20                                                                                                              
          7566 JONES      MANAGER         7839 02-4月 -81           2975                    20                                                                                                              
          7788 SCOTT      ANALYST         7566 19-4月 -87           3000                    20                                                                                                              
          7876 ADAMS      CLERK           7788 23-5月 -87           1100                    20                                                                                                              
          7902 FORD       ANALYST         7566 03-12月-81           3000                    20                                                                                                              
    
    已选择 5 行。
    
    SQL> --创建表:员工号 姓名  月薪 年薪 部门名称
    SQL> create table empinfo
      2  as
      3  select e.empno,e.ename,e.sal,e.sal*12 annsal,d.dname
      4  from emp e,dept d
      5  where e.deptno=d.deptno;
    
    表已创建。
    
    SQL> select * from empinfo;
    
         EMPNO ENAME             SAL     ANNSAL DNAME                                                                                                                                                       
    ---------- ---------- ---------- ---------- --------------                                                                                                                                              
          7369 SMITH             800       9600 RESEARCH                                                                                                                                                    
          7499 ALLEN            1600      19200 SALES                                                                                                                                                       
          7521 WARD             1250      15000 SALES                                                                                                                                                       
          7566 JONES            2975      35700 RESEARCH                                                                                                                                                    
          7654 MARTIN           1250      15000 SALES                                                                                                                                                       
          7698 BLAKE            2850      34200 SALES                                                                                                                                                       
          7782 CLARK            2450      29400 ACCOUNTING                                                                                                                                                  
          7788 SCOTT            3000      36000 RESEARCH                                                                                                                                                    
          7839 KING             5000      60000 ACCOUNTING                                                                                                                                                  
          7844 TURNER           1500      18000 SALES                                                                                                                                                       
          7876 ADAMS            1100      13200 RESEARCH                                                                                                                                                    
    
         EMPNO ENAME             SAL     ANNSAL DNAME                                                                                                                                                       
    ---------- ---------- ---------- ---------- --------------                                                                                                                                              
          7900 JAMES             950      11400 SALES                                                                                                                                                       
          7902 FORD             3000      36000 RESEARCH                                                                                                                                                    
          7934 MILLER           1300      15600 ACCOUNTING                                                                                                                                                  
    
    已选择 14 行。
    
    SQL> host cls
    
    SQL> --修改表:增加新列,修改列,删除列,重命名列,重命名表
    SQL> set linesize 80
    SQL> desc test1
     名称                                      是否为空? 类型
     ----------------------------------------- -------- ----------------------------
     TID                                                NUMBER
     TNAME                                              VARCHAR2(20)
    
    SQL> --增加新列
    SQL> alter table test1 add photo blob;
    
    表已更改。
    
    SQL> desc test1
     名称                                      是否为空? 类型
     ----------------------------------------- -------- ----------------------------
     TID                                                NUMBER
     TNAME                                              VARCHAR2(20)
     PHOTO                                              BLOB
    
    SQL> --修改列
    SQL> alter table test1 modify tname varchar2(40);
    
    表已更改。
    
    SQL>  desc test1
     名称                                      是否为空? 类型
     ----------------------------------------- -------- ----------------------------
     TID                                                NUMBER
     TNAME                                              VARCHAR2(40)
     PHOTO                                              BLOB
    
    SQL> --删除列
    SQL> alter table test1 drop column photo;
    
    表已更改。
    
    SQL>  desc test1
     名称                                      是否为空? 类型
     ----------------------------------------- -------- ----------------------------
     TID                                                NUMBER
     TNAME                                              VARCHAR2(40)
    
    SQL> --重命名列
    SQL> alter table test1 rename column tname to username;
    
    表已更改。
    
    SQL> desc test1
     名称                                      是否为空? 类型
     ----------------------------------------- -------- ----------------------------
     TID                                                NUMBER
     USERNAME                                           VARCHAR2(40)
    
    SQL> --重命名表
    SQL> rename test1 to test2;
    
    表已重命名。
    
    SQL> host cls
    
    SQL> --删除表
    SQL> select * from tab;
    
    TNAME                          TABTYPE  CLUSTERID                               
    ------------------------------ ------- ----------                               
    DEPT                           TABLE                                            
    EMP                            TABLE                                            
    BONUS                          TABLE                                            
    SALGRADE                       TABLE                                            
    TEMPTEST1                      TABLE                                            
    EMP10                          TABLE                                            
    TESTSAVEPOINT                  TABLE                                            
    TESTDELETE                     TABLE                                            
    EMP20                          TABLE                                            
    EMPINFO                        TABLE                                            
    TEST2                          TABLE                                            
    
    已选择 11 行。
    
    SQL> drop table TESTDELETE;
    
    表已删除。
    
    SQL> select * from tab;
    
    TNAME                          TABTYPE  CLUSTERID                               
    ------------------------------ ------- ----------                               
    DEPT                           TABLE                                            
    EMP                            TABLE                                            
    BONUS                          TABLE                                            
    SALGRADE                       TABLE                                            
    TEMPTEST1                      TABLE                                            
    EMP10                          TABLE                                            
    TESTSAVEPOINT                  TABLE                                            
    BIN$z6+GnIyhQtaIrbPpN1H99A==$0 TABLE                                            
    EMP20                          TABLE                                            
    EMPINFO                        TABLE                                            
    TEST2                          TABLE                                            
    
    已选择 11 行。
    
    SQL> --查看回收站
    SQL> show recyclebin;
    ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME          
    ---------------- ------------------------------ ------------ -------------------
    TESTDELETE       BIN$z6+GnIyhQtaIrbPpN1H99A==$0 TABLE        2016-10-06:15:24:14
    SQL> --清空回收站
    SQL> purge recyclebin;
    
    回收站已清空。
    
    SQL> host cls
    
    SQL> select * from TESTSAVEPOINT;
    
           TID TNAME                                                                
    ---------- --------------------                                                 
             1 Tom                                                                  
             2 Mary                                                                 
    
    已选择 2 行。
    
    SQL> drop table TESTSAVEPOINT;
    
    表已删除。
    
    SQL> show recyclebin;
    ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME          
    ---------------- ------------------------------ ------------ -------------------
    TESTSAVEPOINT    BIN$384BF4yOT+aAlXzC7eLPIA==$0 TABLE        2016-10-06:15:28:07
    SQL> select * from TESTSAVEPOINT;
    select * from TESTSAVEPOINT
                  *1 行出现错误: 
    ORA-00942: 表或视图不存在 
    
    
    SQL> select * from tab;
    
    TNAME                          TABTYPE  CLUSTERID                               
    ------------------------------ ------- ----------                               
    DEPT                           TABLE                                            
    EMP                            TABLE                                            
    BONUS                          TABLE                                            
    SALGRADE                       TABLE                                            
    TEMPTEST1                      TABLE                                            
    EMP10                          TABLE                                            
    BIN$384BF4yOT+aAlXzC7eLPIA==$0 TABLE                                            
    EMP20                          TABLE                                            
    EMPINFO                        TABLE                                            
    TEST2                          TABLE                                            
    
    已选择 10 行。
    
    SQL> select * from BIN$384BF4yOT+aAlXzC7eLPIA==$0;
    select * from BIN$384BF4yOT+aAlXzC7eLPIA==$0
                               *1 行出现错误: 
    ORA-00933: SQL 命令未正确结束 
    
    
    SQL> select * from "BIN$384BF4yOT+aAlXzC7eLPIA==$0";
    
           TID TNAME                                                                
    ---------- --------------------                                                 
             1 Tom                                                                  
             2 Mary                                                                 
    
    已选择 2 行。
    
    SQL> --注意:管理员没有回收站
    SQL> show user
    USER 为 "SCOTT"
    SQL> show recyclebin;
    ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME          
    ---------------- ------------------------------ ------------ -------------------
    TESTSAVEPOINT    BIN$384BF4yOT+aAlXzC7eLPIA==$0 TABLE        2016-10-06:15:28:07
    SQL> --闪回删除 ---> 回收站
    SQL> flashback table TESTSAVEPOINT to before drop;
    
    闪回完成。
    
    SQL> show recyclebin;
    SQL> select * from TESTSAVEPOINT;
    
           TID TNAME                                                                
    ---------- --------------------                                                 
             1 Tom                                                                  
             2 Mary                                                                 
    
    已选择 2 行。
    
    SQL> create table test3
      2  (tid number,
      3   tname varchar2(20),
      4   gender varchar2(2) check (gender in ('','')),
      5   sal  number check (sal > 0)
      6  );
    
    表已创建。
    
    SQL> insert into test3 values(1,'Tom','',2000);
    
    已创建 1 行。
    
    SQL> insert into test3 values(2,'Mike','',2000);
    insert into test3 values(2,'Mike','',2000)
    *1 行出现错误: 
    ORA-02290: 违反检查约束条件 (SCOTT.SYS_C005393) 
    
    
    SQL> create table student
      2  (
      3   sid number constraint student_pk primary key,
      4   sname varchar2(20) constraint student_name_notnull not null,
      5   gender varchar2(2) constraint student_gender check (gender in ('','')),
      6   email varchar2(40) constraint student_email_unique unique
      7                      constraint student_email_notnull not null,
      8   deptno number constraint student_fk reference dept(deptno) on delete set null
      9  );
     deptno number constraint student_fk reference dept(deptno) on delete set null
                   *8 行出现错误: 
    ORA-02253: 此处不允许约束条件说明 
    
    
    SQL> create table student
      2  (
      3   sid number constraint student_pk primary key,
      4   sname varchar2(20) constraint student_name_notnull not null,
      5   gender varchar2(2) constraint student_gender check (gender in ('','')),
      6   email varchar2(40) constraint student_email_unique unique
      7                      constraint student_email_notnull not null,
      8   deptno number constraint student_fk references dept(deptno) on delete set null
      9  );
    
    表已创建。
    
    SQL> insert into student values(1,'Tom','','tom@126.com',10);
    
    已创建 1 行。
    
    SQL> insert into student values(2,'Mike','','tom@126.com',10);
    insert into student values(2,'Mike','','tom@126.com',10)
    *1 行出现错误: 
    ORA-00001: 违反唯一约束条件 (SCOTT.STUDENT_EMAIL_UNIQUE) 
    
    
    SQL> spool off
    创建和管理表
    SQL> --视图
    SQL> create view empinfoview
      2  as
      3  select e.empno,e.ename,e.sal,e.sal*12 annsal,d.dname
      4  from emp e,dept d
      5  where e.deptno=d.deptno;
    create view empinfoview
                *1 行出现错误: 
    ORA-01031: 权限不足 
    
    
    SQL> /
    
    视图已创建。
    
    SQL> desc empinfoview
     名称                                      是否为空? 类型
     ----------------------------------------- -------- ----------------------------
     EMPNO                                     NOT NULL NUMBER(4)
     ENAME                                              VARCHAR2(10)
     SAL                                                NUMBER(7,2)
     ANNSAL                                             NUMBER
     DNAME                                              VARCHAR2(14)
    
    SQL> select * from empinfoview;
    
         EMPNO ENAME             SAL     ANNSAL DNAME                               
    ---------- ---------- ---------- ---------- --------------                      
          7369 SMITH             800       9600 RESEARCH                            
          7499 ALLEN            1600      19200 SALES                               
          7521 WARD             1250      15000 SALES                               
          7566 JONES            2975      35700 RESEARCH                            
          7654 MARTIN           1250      15000 SALES                               
          7698 BLAKE            2850      34200 SALES                               
          7782 CLARK            2450      29400 ACCOUNTING                          
          7788 SCOTT            3000      36000 RESEARCH                            
          7839 KING             5000      60000 ACCOUNTING                          
          7844 TURNER           1500      18000 SALES                               
          7876 ADAMS            1100      13200 RESEARCH                            
    
         EMPNO ENAME             SAL     ANNSAL DNAME                               
    ---------- ---------- ---------- ---------- --------------                      
          7900 JAMES             950      11400 SALES                               
          7902 FORD             3000      36000 RESEARCH                            
          7934 MILLER           1300      15600 ACCOUNTING                          
    
    已选择 14 行。
    
    SQL> create or replace view empinfoview
      2  as
      3  select e.empno,e.ename,e.sal,e.sal*12 annsal,d.dname
      4  from emp e,dept d
      5  where e.deptno=d.deptno
      6  with read only;
    
    视图已创建。
    
    SQL> host cls
    
    SQL> --序列
    SQL> create sequence myseq;
    
    序列已创建。
    
    SQL> create table testseq
      2  (tid number,tname varchar2(20));
    
    表已创建。
    
    SQL> select myseq.currval from dual;
    select myseq.currval from dual
           *1 行出现错误: 
    ORA-08002: 序列 MYSEQ.CURRVAL 尚未在此会话中定义 
    
    
    SQL> select myseq.nextval from dual;
    
       NEXTVAL                                                                      
    ----------                                                                      
             1                                                                      
    
    已选择 1 行。
    
    SQL> select myseq.currval from dual;
    
       CURRVAL                                                                      
    ----------                                                                      
             1                                                                      
    
    已选择 1 行。
    
    SQL> insert into  testseq values(myseq.nextval,'aaa');
    
    已创建 1 行。
    
    SQL> /
    
    已创建 1 行。
    
    SQL> /
    
    已创建 1 行。
    
    SQL> /
    
    已创建 1 行。
    
    SQL> commit;
    
    提交完成。
    
    SQL> select * from testseq;
    
           TID TNAME                                                                
    ---------- --------------------                                                 
             2 aaa                                                                  
             3 aaa                                                                  
             4 aaa                                                                  
             5 aaa                                                                  
    
    已选择 4 行。
    
    SQL> insert into  testseq values(myseq.nextval,'aaa');
    
    已创建 1 行。
    
    SQL> /
    
    已创建 1 行。
    
    SQL> rollback;
    
    回退已完成。
    
    SQL> insert into  testseq values(myseq.nextval,'aaa');
    
    已创建 1 行。
    
    SQL> select * from testseq;
    
           TID TNAME                                                                
    ---------- --------------------                                                 
             2 aaa                                                                  
             3 aaa                                                                  
             4 aaa                                                                  
             5 aaa                                                                  
             8 aaa                                                                  
    
    已选择 5 行。
    
    SQL> host cls
    
    SQL> --索引
    SQL> --SQL的执行计划
    SQL> explain plan for select * from emp where deptno=10;
    
    已解释。
    
    SQL> select * from table(dbms_xplan.display);
    
    PLAN_TABLE_OUTPUT                                                               
    --------------------------------------------------------------------------------
    Plan hash value: 3956160932                                                     
                                                                                    
    --------------------------------------------------------------------------      
    | Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |      
    --------------------------------------------------------------------------      
    |   0 | SELECT STATEMENT  |      |     3 |   261 |     3   (0)| 00:00:01 |      
    |*  1 |  TABLE ACCESS FULL| EMP  |     3 |   261 |     3   (0)| 00:00:01 |      
    --------------------------------------------------------------------------      
                                                                                    
    Predicate Information (identified by operation id):                             
    ---------------------------------------------------                             
    
    PLAN_TABLE_OUTPUT                                                               
    --------------------------------------------------------------------------------
                                                                                    
       1 - filter("DEPTNO"=10)                                                      
                                                                                    
    Note                                                                            
    -----                                                                           
       - dynamic sampling used for this statement                                   
    
    已选择 17 行。
    
    SQL> host cls
    
    SQL> --创建目录(索引)
    SQL> create index myindex on emp(deptno);
    
    索引已创建。
    
    SQL> explain plan for select * from emp where deptno=10;
    
    已解释。
    
    SQL> select * from table(dbms_xplan.display);
    
    PLAN_TABLE_OUTPUT                                                               
    --------------------------------------------------------------------------------
    Plan hash value: 2762842933                                                     
                                                                                    
    --------------------------------------------------------------------------------
    -------                                                                         
                                                                                    
    | Id  | Operation                   | Name    | Rows  | Bytes | Cost (%CPU)| Tim
    e     |                                                                         
                                                                                    
    --------------------------------------------------------------------------------
    -------                                                                         
                                                                                    
    
    PLAN_TABLE_OUTPUT                                                               
    --------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT            |         |     3 |   261 |     2   (0)| 00:
    00:01 |                                                                         
                                                                                    
    |   1 |  TABLE ACCESS BY INDEX ROWID| EMP     |     3 |   261 |     2   (0)| 00:
    00:01 |                                                                         
                                                                                    
    |*  2 |   INDEX RANGE SCAN          | MYINDEX |     3 |       |     1   (0)| 00:
    00:01 |                                                                         
                                                                                    
    --------------------------------------------------------------------------------
    -------                                                                         
    
    PLAN_TABLE_OUTPUT                                                               
    --------------------------------------------------------------------------------
                                                                                    
                                                                                    
    Predicate Information (identified by operation id):                             
    ---------------------------------------------------                             
                                                                                    
       2 - access("DEPTNO"=10)                                                      
                                                                                    
    Note                                                                            
    -----                                                                           
       - dynamic sampling used for this statement                                   
    
    已选择 18 行。
    
    SQL> set linesize 200
    SQL> select * from table(dbms_xplan.display);
    
    PLAN_TABLE_OUTPUT                                                                                                                                                                                       
    --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    Plan hash value: 2762842933                                                                                                                                                                             
                                                                                                                                                                                                            
    ---------------------------------------------------------------------------------------                                                                                                                 
    | Id  | Operation                   | Name    | Rows  | Bytes | Cost (%CPU)| Time     |                                                                                                                 
    ---------------------------------------------------------------------------------------                                                                                                                 
    |   0 | SELECT STATEMENT            |         |     3 |   261 |     2   (0)| 00:00:01 |                                                                                                                 
    |   1 |  TABLE ACCESS BY INDEX ROWID| EMP     |     3 |   261 |     2   (0)| 00:00:01 |                                                                                                                 
    |*  2 |   INDEX RANGE SCAN          | MYINDEX |     3 |       |     1   (0)| 00:00:01 |                                                                                                                 
    ---------------------------------------------------------------------------------------                                                                                                                 
                                                                                                                                                                                                            
    Predicate Information (identified by operation id):                                                                                                                                                     
    
    PLAN_TABLE_OUTPUT                                                                                                                                                                                       
    --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    ---------------------------------------------------                                                                                                                                                     
                                                                                                                                                                                                            
       2 - access("DEPTNO"=10)                                                                                                                                                                              
                                                                                                                                                                                                            
    Note                                                                                                                                                                                                    
    -----                                                                                                                                                                                                   
       - dynamic sampling used for this statement                                                                                                                                                           
    
    已选择 18 行。
    
    SQL> host cls
    
    SQL> --同义词(别名)
    SQL> show user
    USER 为 "SCOTT"
    SQL> select count(*) from hr.employees;
    select count(*) from hr.employees
                            *1 行出现错误: 
    ORA-00942: 表或视图不存在 
    
    
    SQL> /
    
      COUNT(*)                                                                                                                                                                                              
    ----------                                                                                                                                                                                              
           107                                                                                                                                                                                              
    
    已选择 1 行。
    
    SQL> --为hr.employees起别名  ---> 同义词
    SQL> create synonym hremp for hr.employees;
    create synonym hremp for hr.employees
    *1 行出现错误: 
    ORA-01031: 权限不足 
    
    
    SQL> /
    
    同义词已创建。
    
    SQL> select count(*) from hremp;
    
      COUNT(*)                                                                                                                                                                                              
    ----------                                                                                                                                                                                              
           107                                                                                                                                                                                              
    
    已选择 1 行。
    
    SQL> spool off
    其他数据库对象

    索引

  • 相关阅读:
    WordPress错误:无法启用插件,因为它引起了一个致命错误
    快速使用 Thinkphp 之一: 准备工作-配置PHP环境及下载Thinkphp文件
    基于XML文件格式引用页面
    PHP清除html、css、js格式并去除空格的PHP函数
    本地无法启动MySQL服务,报的错误:1067,进程意外终止
    快速使用 Thinkphp 之二: 创建自己的应用项目
    HTML页面里加载flash文件源码
    【学习笔记】数据库 windrainpy
    【转】给年轻程序员的建议 windrainpy
    【转】js变量以及其作用域详解 windrainpy
  • 原文地址:https://www.cnblogs.com/xieyupeng/p/7289451.html
Copyright © 2020-2023  润新知