现在的位置: 首页 > 综合 > 正文

oracle9i学习笔记之十 创建视图

2013年09月06日 ⁄ 综合 ⁄ 共 4241字 ⁄ 字号 评论关闭

 1.关于视图
  -限制对数据库的访问
  -容易实现复杂的查询
  -对于相同的数据可以产生不同的视图

2.创建视图
1)在CREATE VIEW语句中嵌入一子查询
  CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view
    [(alias[,alias]...)]
  AS subquery
  [WITH CHECK OPTION [CONSTRAINT constraint]]
  [WITH READ ONLY]

  例:创建视图empv,该属兔仅包含10部门雇员的细节信息。
      CREATE VIEW empv
        AS SELECT empno,ename,job
           FROM   emp
           WHERE  deptno=10;
     
  查看:DESC empv

2)别名的使用
  例1:CREATE OR REPLACE VIEW salv
       AS SELECT empno EMPLOYEE_ID,ename NAME,sal SALARY
          FROM   emp
          WHERE  deptno=30;

  例2:CREATE OR REPLACE VIEW salv
              (EMPLOYEE_ID,NAME,SALARY)
       AS SELECT empno,ename,sal
          FROM   emp
          WHERE  deptno=30;

3.创建复杂视图
  例:创建一个基于两个表并且含有组函数的复杂视图
      CREATE OR REPLACE VIEW dept_sum_v(name,minsal,maxsal,avgsal)
      AS SELECT   d.dname,MIN(e.sal),MAX(e.sal),AVG(e.sal)
         FROM     emp e,dept d
         WHERE    e.deptno=d.deptno
         GROUP BY d.dname;

4.查看视图
  数据字典USER_VIEWS
 
  SELECT view_name,text
  FROM   user_views;
  结果:
   VIEW_NAME  TEXT 
        SALV  SELECT empno EMPLOYEE_ID,ename NAME,sal SALARY FROM emp WH 

                         

5.从视图检索数据
  SELECT * FROM salv;

6.视图上执行DML操作
1)如果视图包含以下内容,则不能实现对数据的修改:
  -GROUP函数、GROUP BY子句、DISTINCT关键字
  -使用表达式定义的列
  -ROWNUM伪列

2)如果视图中包含以下内容则不能删除数据行
  -GROUP函数
  -GROUP BY子句
  -DISTINCT关键字
  -ROWNUM伪列

7.WITH CHECK OPTION子句
  -如果要确保在视图上执行的插入、更新操作仅限于一定的范围,便可使用WITH CHECK OPTION 子句
  例:
      CREATE OR REPLACE VIEW empv
      AS SELECT *
         FROM   emp
         WHERE  deptno=20
      WITH CHECK OPTION CONSTRAINT empv_ck;

   测试一:update empv set deptno=10 where empno=7369
     结果:
           ERROR 位于第 1 行:
           ORA-01402: 视图 WITH CHECK OPTIDN 违反 where 子句

   测试二:update empv set sal=2000 where empno=7369
     结果:已更新 1 行。

8.拒绝DML操作
  -在视图定义时使用WITH READ ONLY选项可以确保不能对视图执行DML操作
 例:
    CREATE OR REPLACE VIEW empv(employee_ID,employ_name,job_title)
    AS SELECT empno,ename,job
       FROM   emp
       WHERE  deptno=10
       WITH READ ONLY;
 
9.删除视图
  -删除视图并不会删除数据,因为视图是基于数据库中的基表
  DROP VIEW view;
 
  例:DROP VIEW empv;

10.小结
   视图是基于一个或多个表或视图的逻辑表,它本身不包含数据,具有一下优点
   -限制对数据库的访问
   -简化查询
   -维护数据的独立性
   -对相同的数据可以建立不同的视图
   -可以删除视图而不影响数据

练习
1.根据emp表来创建视图empv,选取ename、job、sal、deptno列,分别对应显示雇员名、工作类别、薪水、部门号
  要求:只看到薪水小于1500的雇员信息

   CREATE OR REPLACE VIEW empv
   AS SELECT ename "雇员名",job "工作类别",sal "薪水",deptno "部门号"
      FROM   emp
      WHERE  sal<1500;
   或:
   CREATE OR REPLACE VIEW empv( "雇员名", "工作类别", "薪水","部门号")
   AS SELECT ename,job,sal,deptno      
      FROM   emp
      WHERE  sal<1500;
  

2.根据emp、dept表来创建视图dept_sum_v,显示empno、ename、job、sal、deptno、dname列信息

   CREATE OR REPLACE VIEW dept_sum_v
   AS SELECT empno,ename,job,sal,d.deptno,dname      
      FROM   emp e,dept d
      WHERE  e.deptno=d.deptno;

3.创建视图empv,显示部门编号、雇员编号、雇员名字、薪水。
  通过视图empv插入数据(10,1000,'小王',2000)

   CREATE OR REPLACE VIEW empv("部门编号","雇员编号","雇员名字","薪水")
   AS SELECT deptno,empno,ename,sal     
      FROM   emp; 

   INSERT INTO empv
   VALUES      (10,1000,'小王',2000); 

4.创建视图empv1,显示部门编号,雇员编号,雇员名字,薪水,年薪。
  通过视图empv1插入数据(10,1000,'小王',2000,24000)
  
   CREATE OR REPLACE VIEW empv1
                     ("部门编号","雇员编号","雇员名字","薪水","年薪")
   AS SELECT deptno,empno,ename,sal,sal*12     
      FROM   emp;   

   INSERT INTO empv1
   VALUES      (10,1000,'小王',2000,24000);

   结果:
         INSERT INTO empv1
         *
         ERROR 位于第 1 行:
         ORA-01733: 此处不允许虚拟列
 

5.创建视图empv2,显示部门编号,雇员名字,薪水,雇用日期
  通过视图empv2插入数据(10,'小王',2000,'2007-8-1')

   CREATE OR REPLACE VIEW empv2("部门编号","雇员名字","薪水","雇用日期")
   AS SELECT deptno,ename,sal,hiredate
      FROM   emp;
 
   INSERT INTO empv2
   VALUES      (10,'小王',2000,'2007-8-1');
   结果:
        VALUES      (10,'小王',2000,'2007-8-1')
        *
        ERROR 位于第 2 行:
        ORA-01861: 文字与格式字符串不匹配

6.创建视图empv3,显示empno,ename,deptno,dname,sal
  通过视图empv3插入数据(1001,'小王',10,'开发部',2000)

   CREATE OR REPLACE VIEW empv3
   AS SELECT empno,ename,d.deptno,dname,sal
      FROM   emp e,dept d
      WHERE  e.deptno=d.deptno; 

   INSERT INTO empv3
   VALUES      (1001,'小王',10,'开发部',2000);
   结果:
        INSERT INTO empv3
        *
        ERROR 位于第 1 行:
        ORA-01776: 无法通过连接视图修改多个基表

7.通过视图empv更新雇员编号是1000的雇员,薪水为2500

   UPDATE empv
   SET    sal=2500
   WHERE  empno=1000;

8.创建视图empv3,根据部门分组显示部门编号、部门最大薪水、最少薪水
  更新部门编号为10的部门,将最少的薪水增加500

    CREATE OR REPLACE VIEW empv3
    AS SELECT   deptno,MAX(sal) maxsal,MIN(sal) minsal
       FROM     emp
       GROUP BY deptno;

   UPDATE empv3
   SET    minsal=minsal+500
   WHERE  deptno=10;
   结果:
        UPDATE empv3
           *
       ERROR 位于第 1 行:
       ORA-01732: 此视图的数据操纵操作非法

9.查看所建立的视图

   SELECT view_name,text
   FROM   user_views;

9.删除以上创建的所有视图
  
   DROP VIEW dept_sum_v;
   DROP VIEW empv;
   DROP VIEW empv1;
   DROP VIEW empv2;
   DROP VIEW empv3;  

  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

抱歉!评论已关闭.