(10)视图(View)【Oracle】

一、Note

1、概念

  • 视图(View)是由 SELECT 查询语句定义的一个“逻辑表”
  • 视图(View)只有定义而无数据,是一个"虚表",是反映了它所依赖的表的数据
  • 视图是一个或多个表(或视图)经过 SELECT 查询后选择的逻辑表示,是一个逻辑上的表,依赖于其它表(或其他视图)存在
  • (视图可依赖于视图,且可以基于视图创建视图)
  • 创建视图时所用的表(或视图)被称作 基础表(Base Table)

2、视图与表类似

  • 视图名称 与 表名称 类似
  • 视图中列的名称、类型、宽度 与 表中相同
  • 视图中可以定义约束条件
  • 视图上也可以执行DML操作(INSERT|UPDATE|DELETE)
  • 表和视图都不允许有重复的列名(表连接时的列名重复不算)
  • 因此,要么在创建视图时显式指定视图的属性列名,要么在创建视图的select语句中定义列的别名

3、注意列名

  • 组成视图的属性列名要么全部忽略要么全部指定,如果省略了视图的各个属性列名,则该视图的列名为子查询中select子句目标列中的列名

  • 有三种情况必须显式指定视图的列名或在select子句中定义列的别名

    • 某个目标列不是单纯的属性名,而是统计函数或列表达式
    • 多表连接时选出了几个同名列作为视图的列
    • 需要在视图为某个列启用新的名称

4、使用目的

  • 提供各种数据表现形式
  • 提高某些安全性保证
  • 隐藏数据的逻辑复杂性并简化查询语句
  • 执行某些必须使用视图的查询
  • 简化用户权限的管理

5、创建视图

  • 语法

    • CREATE [OR REPLACE] [FORCE] VIEW 视图名称[ (列名 , ...) ]
      AS 查询语句 
      [ WITH CHECK OPTION ]
      
    • create:不进行判断,若数据库中已存在相同视图名的视图,则报错,原因是对象已存在

    • create or replace:进行判断,若数据库中已存在这个名字的视图,就替代它,若不存在则创建视图

    • 表也可以用create or replace来创建

    • force:创建视图失败时,强制创建视图

    • 不加with check option后,向视图中insert的数据会直接加入表中,不受约束

  • 步骤

    • 编写查询语句
    • 测试查询语句
    • 检查查询结果的正确性
    • 使用查询语句创建视图
  • 权限

    • 在当前用户中创建视图需要具有 CREATE VIEW 权限

6、查看用户的视图信息

  • 通过 user_objects 数据字典查看

  • 通过 user_views 数据字典查看

    • user_views中的text列是long类型(可达2G),存储着视图里的select查询语句,注意text列是长的文本数据,不是java中的数值类型
  • 创建视图后,可以在user_objects数据字典找到视图这一数据库对象,若没创建则找不到

  • 查询信息可知,视图和表、索引一样,都有状态

7、使用视图

  • 通常使用视图完成查询操作

  • 有时也会借助视图实现DML操作

    • 视图中的数据DML后,对应的基础表数据也会DML
  • 针对一个基础表创建的视图,可以进行DML操作

  • 针对多个基础表创建的视图,不可以进行DML操作

8、删除视图

  • 语法

    • DROP VIEW 视图名称 ;
  • 权限

    • 在当前用户中删除视图需要具有 DROP VIEW 权限
  • 可删除不需要的视图以释放存储空间

  • 视图删除后,只会删除视图在数据库中的定义,而与视图有关的数据表中的数据不会受到影响,同时由此视图导出的其他视图仍然存在,但已无意义

  • 即删除视图后,基础表仍然存在

二、Code

视图:创建视图/使用视图/查看视图/删除视图

  • 视图进行DML操作时,看起来是视图中的数据DML了,但数据其实是按照视图映射的那几列,重新DML操作了基础表

  • 先赋予用户创建视图的权限:GRANT create view TO ecuter ;

  • 再创建视图:

    CREATE VIEW view_emp (id , name , job , salary) AS SELECT empno , ename , job , sal FROM emp ;

  • 尝试 向 视图view_emp 中插入数据

    INSERT INTO view_emp ( id , name , job , salary ) VALUES ( 1 , 'tom' , 'clerk' , 1000 ) ;

  • 查看创建视图时使用的表 ( 也就是视图对应的基础表 )

    SELECT * FROM emp ;

  • 更新视图(基础表的数据也会更新)

    UPDATE view_emp SET salary = 1500 WHERE id = 1 ;

  • 删除视图的某条记录(基础表的记录也被删除)

    DELETE FROM view_emp WHERE id = 1 ;

  • 删除视图(基础表仍然存在)

    DROP VIEW view_emp ;

  • 查询每个雇员的工号、姓名、岗位、部门名称、上司的工号、姓名、岗位、部门名称;不统计没有部门的雇员、不统计没有员工的部门

    SELECT e.empno , e.ename , e.job , de.dname , m.empno , m.ename , m.job , dm.dname
    FROM emp e
    JOIN emp m ON e.mgr = m.empno
    JOIN dept de ON e.deptno = de.deptno
    JOIN dept dm ON e.deptno = dm.deptno ;
    -- 把两张表当四张表使用
    
  • 通过视图简化以上查询

    -- 视图中不能有重复的列名 
    CREATE VIEW view_emp_dept ( emp_id , emp_name , emp_job , emp_dname , mgr_id , mgr_name , mgr_job , mgr_dname )
    AS
    SELECT e.empno , e.ename , e.job , de.dname , m.empno , m.ename , m.job , dm.dname
    FROM emp e 
    JOIN emp m ON e.mgr=m.empno
    JOIN dept de ON e.deptno = de.deptno
    JOIN dept dm ON m.deptno = dm.deptno ;
    
  • 以后要是再需要完成这么高难度的查询,就可以查询 view_emp_dept 视图了

    SELECT * FROM view_emp_dept ;

控制台下的具体sql代码:

SQL> 
SQL> -- 用户所有的数据库对象都可以通过查询 user_objects 来查看
SQL> 
SQL> -- 单独查询用户的表可以查看 user_tables
SQL> 
SQL> -- 单独查询用户的索引可以查看 user_indexes
SQL> 
SQL> -- 单独查询用户的约束可以查看 user_constraints 、user_cons_columns
SQL> 
SQL> -- 单独查询用户的视图可以查看 user_views
SQL> 
SQL> 
SQL> -- 创建视图
SQL> 
SQL> set linesize 150 ;
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 09-12-82           3000                    20                                                            
      7839 KING       PRESIDENT            17-11-81           5000                    10                                                            
      7844 TURNER     SALESMAN        7698 08-9-81           1500          0         30                                                            
      7876 ADAMS      CLERK           7788 12-1-83           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                                                            
      9257 HUA'AN     CLERK           7839 23-1月 -85           1300                                                                                  
      8526 QIU'XIANG  ANALYST         7839 23-1-85           1400                                                                                  

已选择16行。

SQL> SELECT * FROM dept ;

    DEPTNO DNAME          LOC                                                                                                                         
---------- -------------- -------------                                                                                                               
        10 ACCOUNTING     NEW YORK                                                                                                                    
        20 RESEARCH       DALLAS                                                                                                                      
        30 SALES          CHICAGO                                                                                                                     
        40 OPERATIONS     BOSTON                                                                                                                      

SQL> 
SQL> SELECT empno , ename , job , sal FROM emp ;

     EMPNO ENAME      JOB              SAL                                                                                                            
---------- ---------- --------- ----------                                                                                                            
      7369 SMITH      CLERK            800                                                                                                            
      7499 ALLEN      SALESMAN        1600                                                                                                            
      7521 WARD       SALESMAN        1250                                                                                                            
      7566 JONES      MANAGER         2975                                                                                                            
      7654 MARTIN     SALESMAN        1250                                                                                                            
      7698 BLAKE      MANAGER         2850                                                                                                            
      7782 CLARK      MANAGER         2450                                                                                                            
      7788 SCOTT      ANALYST         3000                                                                                                            
      7839 KING       PRESIDENT       5000                                                                                                            
      7844 TURNER     SALESMAN        1500                                                                                                            
      7876 ADAMS      CLERK           1100                                                                                                            

     EMPNO ENAME      JOB              SAL                                                                                                            
---------- ---------- --------- ----------                                                                                                            
      7900 JAMES      CLERK            950                                                                                                            
      7902 FORD       ANALYST         3000                                                                                                            
      7934 MILLER     CLERK           1300                                                                                                            
      9257 HUA'AN     CLERK           1300                                                                                                            
      8526 QIU'XIANG  ANALYST         1400                                                                                                            

已选择16行。

SQL> CREATE VIEW view_emp ( id , name , job , salary ) AS SELECT empno , ename , job , sal FROM emp ;
CREATE VIEW view_emp ( id , name , job , salary ) AS SELECT empno , ename , job , sal FROM emp 
            *1 行出现错误: 
ORA-01031: 权限不足 


SQL> connect sys / as sysdba
已连接。
SQL> show user ;
USER"SYS"
SQL> GRANT create view TO ecuter ;

授权成功。

SQL> connect ecuter/ecuter
已连接。
SQL> show user ;
USER"ECUTER"
SQL> CREATE VIEW view_emp ( id , name , job , salary ) AS SELECT empno , ename , job , sal FROM emp ;

视图已创建。

SQL> 
SQL> DESC view_emp ;
 名称                                                                                是否为空? 类型
 ----------------------------------------------------------------------------------- -------- --------------------------------------------------------
 ID                                                                                  NOT NULL NUMBER(4)
 NAME                                                                                         VARCHAR2(10)
 JOB                                                                                          VARCHAR2(9)
 SALARY                                                                                       NUMBER(7,2)

SQL> 
SQL> SELECT * FROM view_emp ;

        ID NAME       JOB           SALARY                                                                                                            
---------- ---------- --------- ----------                                                                                                            
      7369 SMITH      CLERK            800                                                                                                            
      7499 ALLEN      SALESMAN        1600                                                                                                            
      7521 WARD       SALESMAN        1250                                                                                                            
      7566 JONES      MANAGER         2975                                                                                                            
      7654 MARTIN     SALESMAN        1250                                                                                                            
      7698 BLAKE      MANAGER         2850                                                                                                            
      7782 CLARK      MANAGER         2450                                                                                                            
      7788 SCOTT      ANALYST         3000                                                                                                            
      7839 KING       PRESIDENT       5000                                                                                                            
      7844 TURNER     SALESMAN        1500                                                                                                            
      7876 ADAMS      CLERK           1100                                                                                                            

        ID NAME       JOB           SALARY                                                                                                            
---------- ---------- --------- ----------                                                                                                            
      7900 JAMES      CLERK            950                                                                                                            
      7902 FORD       ANALYST         3000                                                                                                            
      7934 MILLER     CLERK           1300                                                                                                            
      9257 HUA'AN     CLERK           1300                                                                                                            
      8526 QIU'XIANG  ANALYST         1400                                                                                                            

已选择16行。

SQL> 
SQL> 
SQL> -- 尝试 向 视图view_emp 中插入数据
SQL> 
SQL> INSERT INTO view_emp ( id , name , job , sal ) VALUES ( 1 , 'tom' , 'clerk' , 1000 ) ;
INSERT INTO view_emp ( id , name , job , sal ) VALUES ( 1 , 'tom' , 'clerk' , 1000 ) 
                                         *1 行出现错误: 
ORA-00904: "SAL": 标识符无效 


SQL> INSERT INTO view_emp ( id , name , job , salary ) VALUES ( 1 , 'tom' , 'clerk' , 1000 ) ;

已创建 1 行。

SQL> 
SQL> SELECT * FROM view_emp ;

        ID NAME       JOB           SALARY                                                                                                            
---------- ---------- --------- ----------                                                                                                            
      7369 SMITH      CLERK            800                                                                                                            
      7499 ALLEN      SALESMAN        1600                                                                                                            
      7521 WARD       SALESMAN        1250                                                                                                            
      7566 JONES      MANAGER         2975                                                                                                            
      7654 MARTIN     SALESMAN        1250                                                                                                            
      7698 BLAKE      MANAGER         2850                                                                                                            
      7782 CLARK      MANAGER         2450                                                                                                            
      7788 SCOTT      ANALYST         3000                                                                                                            
      7839 KING       PRESIDENT       5000                                                                                                            
      7844 TURNER     SALESMAN        1500                                                                                                            
      7876 ADAMS      CLERK           1100                                                                                                            

        ID NAME       JOB           SALARY                                                                                                            
---------- ---------- --------- ----------                                                                                                            
      7900 JAMES      CLERK            950                                                                                                            
      7902 FORD       ANALYST         3000                                                                                                            
      7934 MILLER     CLERK           1300                                                                                                            
      9257 HUA'AN     CLERK           1300                                                                                                            
      8526 QIU'XIANG  ANALYST         1400                                                                                                            
         1 tom        clerk           1000                                                                                                            

已选择17行。

SQL> -- 查看创建视图时使用的表 ( 也就是视图对应的基础表 )
SQL> 
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 09-12-82           3000                    20                                                            
      7839 KING       PRESIDENT            17-11-81           5000                    10                                                            
      7844 TURNER     SALESMAN        7698 08-9-81           1500          0         30                                                            
      7876 ADAMS      CLERK           7788 12-1-83           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                                                            
      9257 HUA'AN     CLERK           7839 23-1月 -85           1300                                                                                  
      8526 QIU'XIANG  ANALYST         7839 23-1-85           1400                                                                                  
         1 tom        clerk                                     1000                                                                                  

已选择17行。

SQL> 
SQL> -- 更新视图
SQL> UPDATE view_emp SET salary = 1500 WHERE id = 1 ;

已更新 1 行。

SQL> SELECT * FROM view_emp ;

        ID NAME       JOB           SALARY                                                                                                            
---------- ---------- --------- ----------                                                                                                            
      7369 SMITH      CLERK            800                                                                                                            
      7499 ALLEN      SALESMAN        1600                                                                                                            
      7521 WARD       SALESMAN        1250                                                                                                            
      7566 JONES      MANAGER         2975                                                                                                            
      7654 MARTIN     SALESMAN        1250                                                                                                            
      7698 BLAKE      MANAGER         2850                                                                                                            
      7782 CLARK      MANAGER         2450                                                                                                            
      7788 SCOTT      ANALYST         3000                                                                                                            
      7839 KING       PRESIDENT       5000                                                                                                            
      7844 TURNER     SALESMAN        1500                                                                                                            
      7876 ADAMS      CLERK           1100                                                                                                            

        ID NAME       JOB           SALARY                                                                                                            
---------- ---------- --------- ----------                                                                                                            
      7900 JAMES      CLERK            950                                                                                                            
      7902 FORD       ANALYST         3000                                                                                                            
      7934 MILLER     CLERK           1300                                                                                                            
      9257 HUA'AN     CLERK           1300                                                                                                            
      8526 QIU'XIANG  ANALYST         1400                                                                                                            
         1 tom        clerk           1500                                                                                                            

已选择17行。

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 09-12-82           3000                    20                                                            
      7839 KING       PRESIDENT            17-11-81           5000                    10                                                            
      7844 TURNER     SALESMAN        7698 08-9-81           1500          0         30                                                            
      7876 ADAMS      CLERK           7788 12-1-83           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                                                            
      9257 HUA'AN     CLERK           7839 23-1月 -85           1300                                                                                  
      8526 QIU'XIANG  ANALYST         7839 23-1-85           1400                                                                                  
         1 tom        clerk                                     1500                                                                                  

已选择17行。

SQL> -- 删除视图的某条记录(基础表的记录也被删除)
SQL> DELETE FROM view_emp WHERE id = 1 ;

已删除 1 行。

SQL> SELECT * FROM view_emp ;

        ID NAME       JOB           SALARY                                                                                                            
---------- ---------- --------- ----------                                                                                                            
      7369 SMITH      CLERK            800                                                                                                            
      7499 ALLEN      SALESMAN        1600                                                                                                            
      7521 WARD       SALESMAN        1250                                                                                                            
      7566 JONES      MANAGER         2975                                                                                                            
      7654 MARTIN     SALESMAN        1250                                                                                                            
      7698 BLAKE      MANAGER         2850                                                                                                            
      7782 CLARK      MANAGER         2450                                                                                                            
      7788 SCOTT      ANALYST         3000                                                                                                            
      7839 KING       PRESIDENT       5000                                                                                                            
      7844 TURNER     SALESMAN        1500                                                                                                            
      7876 ADAMS      CLERK           1100                                                                                                            

        ID NAME       JOB           SALARY                                                                                                            
---------- ---------- --------- ----------                                                                                                            
      7900 JAMES      CLERK            950                                                                                                            
      7902 FORD       ANALYST         3000                                                                                                            
      7934 MILLER     CLERK           1300                                                                                                            
      9257 HUA'AN     CLERK           1300                                                                                                            
      8526 QIU'XIANG  ANALYST         1400                                                                                                            

已选择16行。

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 09-12-82           3000                    20                                                            
      7839 KING       PRESIDENT            17-11-81           5000                    10                                                            
      7844 TURNER     SALESMAN        7698 08-9-81           1500          0         30                                                            
      7876 ADAMS      CLERK           7788 12-1-83           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                                                            
      9257 HUA'AN     CLERK           7839 23-1月 -85           1300                                                                                  
      8526 QIU'XIANG  ANALYST         7839 23-1-85           1400                                                                                  

已选择16行。

SQL> DROP VIEW view_emp ;

视图已删除。

SQL> 
SQL> 
SQL> DESC view_emp ;
ERROR:
ORA-04043: 对象 view_emp  不存在 


SQL> DESC emp ;
 名称                                                                                是否为空? 类型
 ----------------------------------------------------------------------------------- -------- --------------------------------------------------------
 EMPNO                                                                               NOT NULL 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> 
SQL> 
SQL> 
SQL> -- 查询每个雇员的工号、姓名、岗位、部门名称、上司的工号、姓名、岗位、部门名称
SQL> -- 不统计没有部门的雇员、也不统计没有员工的部门
SQL> 
SQL> SELECT e.empno , e.ename , e.job , de.dname , m.empno , m.ename , m.job , dm.dname
  2  FROM emp e
  3  JOIN emp m ON e.mgr = m.empno
  4  JOIN dept de ON e.deptno = de.deptno
  5  JOIN dept dm ON m.deptno = dm.deptno ;

     EMPNO ENAME      JOB       DNAME               EMPNO ENAME      JOB       DNAME                                                                  
---------- ---------- --------- -------------- ---------- ---------- --------- --------------                                                         
      7566 JONES      MANAGER   RESEARCH             7839 KING       PRESIDENT ACCOUNTING                                                             
      7698 BLAKE      MANAGER   SALES                7839 KING       PRESIDENT ACCOUNTING                                                             
      7782 CLARK      MANAGER   ACCOUNTING           7839 KING       PRESIDENT ACCOUNTING                                                             
      7934 MILLER     CLERK     ACCOUNTING           7782 CLARK      MANAGER   ACCOUNTING                                                             
      7369 SMITH      CLERK     RESEARCH             7902 FORD       ANALYST   RESEARCH                                                               
      7876 ADAMS      CLERK     RESEARCH             7788 SCOTT      ANALYST   RESEARCH                                                               
      7788 SCOTT      ANALYST   RESEARCH             7566 JONES      MANAGER   RESEARCH                                                               
      7902 FORD       ANALYST   RESEARCH             7566 JONES      MANAGER   RESEARCH                                                               
      7499 ALLEN      SALESMAN  SALES                7698 BLAKE      MANAGER   SALES                                                                  
      7521 WARD       SALESMAN  SALES                7698 BLAKE      MANAGER   SALES                                                                  
      7654 MARTIN     SALESMAN  SALES                7698 BLAKE      MANAGER   SALES                                                                  

     EMPNO ENAME      JOB       DNAME               EMPNO ENAME      JOB       DNAME                                                                  
---------- ---------- --------- -------------- ---------- ---------- --------- --------------                                                         
      7844 TURNER     SALESMAN  SALES                7698 BLAKE      MANAGER   SALES                                                                  
      7900 JAMES      CLERK     SALES                7698 BLAKE      MANAGER   SALES                                                                  

已选择13行。

SQL> 
SQL> 
SQL> -- 可以通过视图简化以上查询
SQL> 
SQL> CREATE VIEW view_emp_dept AS
  2  SELECT e.empno , e.ename , e.job , de.dname , m.empno , m.ename , m.job , dm.dname
  3  FROM emp e JOIN emp m ON e.mgr = m.empno
  4  JOIN dept de ON e.deptno = de.deptno
  5  JOIN dept dm ON m.deptno = dm.deptno ;
SELECT e.empno , e.ename , e.job , de.dname , m.empno , m.ename , m.job , dm.dname
                                                *2 行出现错误: 
ORA-00957: 重复的列名 


SQL> CREATE VIEW view_emp_dept
  2  ( emp_id , emp_name , emp_job , emp_dname , mgr_id , mgr_name , mgr_job , mgr_dname )
  3  AS
  4  SELECT e.empno , e.ename , e.job , de.dname , m.empno , m.ename , m.job , dm.dname
  5  FROM emp e JOIN emp m ON e.mgr = m.empno JOIN dept de ON e.deptno = de.deptno JOIN dept dm ON m.deptno = dm.deptno ;

视图已创建。

SQL> 
SQL> 
SQL> -- 以后要是再需要完成这么高难度的查询,就可以查询 view_emp_dept 视图了
SQL> 
SQL> SELECT * FROM view_emp_dept ;

    EMP_ID EMP_NAME   EMP_JOB   EMP_DNAME          MGR_ID MGR_NAME   MGR_JOB   MGR_DNAME                                                              
---------- ---------- --------- -------------- ---------- ---------- --------- --------------                                                         
      7566 JONES      MANAGER   RESEARCH             7839 KING       PRESIDENT ACCOUNTING                                                             
      7698 BLAKE      MANAGER   SALES                7839 KING       PRESIDENT ACCOUNTING                                                             
      7782 CLARK      MANAGER   ACCOUNTING           7839 KING       PRESIDENT ACCOUNTING                                                             
      7934 MILLER     CLERK     ACCOUNTING           7782 CLARK      MANAGER   ACCOUNTING                                                             
      7369 SMITH      CLERK     RESEARCH             7902 FORD       ANALYST   RESEARCH                                                               
      7876 ADAMS      CLERK     RESEARCH             7788 SCOTT      ANALYST   RESEARCH                                                               
      7788 SCOTT      ANALYST   RESEARCH             7566 JONES      MANAGER   RESEARCH                                                               
      7902 FORD       ANALYST   RESEARCH             7566 JONES      MANAGER   RESEARCH                                                               
      7499 ALLEN      SALESMAN  SALES                7698 BLAKE      MANAGER   SALES                                                                  
      7521 WARD       SALESMAN  SALES                7698 BLAKE      MANAGER   SALES                                                                  
      7654 MARTIN     SALESMAN  SALES                7698 BLAKE      MANAGER   SALES                                                                  

    EMP_ID EMP_NAME   EMP_JOB   EMP_DNAME          MGR_ID MGR_NAME   MGR_JOB   MGR_DNAME                                                              
---------- ---------- --------- -------------- ---------- ---------- --------- --------------                                                         
      7844 TURNER     SALESMAN  SALES                7698 BLAKE      MANAGER   SALES                                                                  
      7900 JAMES      CLERK     SALES                7698 BLAKE      MANAGER   SALES                                                                  

已选择13行。

SQL> DESC view_emp_dept ;
 名称                                                                                是否为空? 类型
 ----------------------------------------------------------------------------------- -------- --------------------------------------------------------
 EMP_ID                                                                              NOT NULL NUMBER(4)
 EMP_NAME                                                                                     VARCHAR2(10)
 EMP_JOB                                                                                      VARCHAR2(9)
 EMP_DNAME                                                                                    VARCHAR2(14)
 MGR_ID                                                                              NOT NULL NUMBER(4)
 MGR_NAME                                                                                     VARCHAR2(10)
 MGR_JOB                                                                                      VARCHAR2(9)
 MGR_DNAME                                                                                    VARCHAR2(14)

SQL> 
SQL> DELETE FROM view_emp_dept WHERE emp_id = 7900 ;
DELETE FROM view_emp_dept WHERE emp_id = 7900 
            *1 行出现错误: 
ORA-01752: 不能从没有一个键值保存表的视图中删除 


SQL> 
SQL> 
SQL> -- 查看视图定义
SQL> 
SQL> DESC user_views ;
 名称                                                                                是否为空? 类型
 ----------------------------------------------------------------------------------- -------- --------------------------------------------------------
 VIEW_NAME                                                                           NOT NULL VARCHAR2(30)
 TEXT_LENGTH                                                                                  NUMBER
 TEXT                                                                                         LONG
 TYPE_TEXT_LENGTH                                                                             NUMBER
 TYPE_TEXT                                                                                    VARCHAR2(4000)
 OID_TEXT_LENGTH                                                                              NUMBER
 OID_TEXT                                                                                     VARCHAR2(4000)
 VIEW_TYPE_OWNER                                                                              VARCHAR2(30)
 VIEW_TYPE                                                                                    VARCHAR2(30)
 SUPERVIEW_NAME                                                                               VARCHAR2(30)
 EDITIONING_VIEW                                                                              VARCHAR2(1)
 READ_ONLY                                                                                    VARCHAR2(1)

SQL> SELECT view_name , TEXT FROM user_views ;

VIEW_NAME                      TEXT                                                                                                                   
------------------------------ --------------------------------------------------------------------------------                                       
VIEW_EMP_DEPT                  SELECT e.empno , e.ename , e.job , de.dname , m.empno , m.ename , m.job , dm.dna                                       

SQL> SELECT view_name , TEXT_LENGTH FROM user_views ;

VIEW_NAME                      TEXT_LENGTH                                                                                                            
------------------------------ -----------                                                                                                            
VIEW_EMP_DEPT                          198                                                                                                            

SQL> column type_text format a50 ;
SQL> SELECT view_name , type_text FROM user_views ;

VIEW_NAME                      TYPE_TEXT                                                                                                              
------------------------------ --------------------------------------------------                                                                     
VIEW_EMP_DEPT                                                                                                                                         

SQL> SELECT view_name , view_type , read_only FROM user_views ;

VIEW_NAME                      VIEW_TYPE                      R                                                                                       
------------------------------ ------------------------------ -                                                                                       
VIEW_EMP_DEPT                                                 N                                                                                       

SQL> spool off
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值