oracle9i學習筆記之十 創建視圖

 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;  

  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章