天天看點

Oracle 11g系列:視圖

  視圖是資料庫中特有的對象,視圖用于存儲查詢,但不會存儲資料(物化視圖除外)。這是視圖和資料表的重要差別。Oracle中有4種視圖:關系視圖、内嵌視圖、對象視圖和物化視圖。

  1、關系視圖

  1>、建立視圖

CREATE VIEW VW_EMPLOYEE
AS
       SELECT EMP_ID,EMP_NAME FROM EMPLOYEES      

  2>、檢視視圖定義

SELECT TEXT FROM USER_VIEWS WHERE VIEW_NAME = 'VW_EMPLOYEE'      

  3>、檢視視圖内容

SELECT * FROM VW_EMPLOYEE      

  4>、修改視圖

CREATE OR REPLACE VIEW VW_EMPLOYEE
AS
       SELECT EMP_ID,EMP_NAME FROM EMPLOYEES      

  5>、删除視圖

DROP VIEW VW_EMPLOYEE      

  6>、編譯視圖

ALTER VIEW VW_EMPLOYEE COMPILE      

  2、内嵌視圖

  内嵌視圖也是視圖,隻是不會使用CREATE VIEW進行顯示建立。一般情況下,被嵌套在查詢語句中使用,是以稱為内嵌視圖。其功能類似于子查詢。

SELECT * FROM ( SELECT EMP_ID,EMP_NAME FROM EMPLOYEES ) WHERE ROWNUM <= 3      

   3、對象視圖

  對象視圖以對象的方式進行資料存儲,是對對象的查詢。對象視圖是基于對象類型來建立的,是以,建立對象視圖之前需要先建立對象類型。

  1>、建立對象類型

CREATE TYPE EMPLOYEE IS OBJECT
( 
       EMP_ID NUMBER,
       EMP_NAME VARCHAR2(20),
       SALARY NUMVER
)      

  CREATE TYPE用于建立新的類型,EMPLOYEE指定了新類型的名稱,IS OBJECT表示類型為一個對象,( EMP_ID NUMBER, EMP_NAME VARCHAR2(20),SALARY NUMVER )為對象類型中各屬性的具體定義。

  2>、建立對象視圖

CREATE OR REPLACE VIEW OV_EMPLOYEES
       OF EMPLOYEE
       WITH OBJECT OID(EMP_ID)
AS
     SELECT EMPLOYEE_ID,EMPLOYEE_NAME SALARY FROM EMPLOYEES      

  CREATE OR REPLACE VIEW用于建立或者替換一個視圖;OV_EMPLOYEES辨別了新視圖的名稱,OV字首表示該視圖是一個對象視圖;OF EMPLOYEE表示新視圖是基于對象類型EMPLOYEE;WITH OBJECT OID用于辨別對象中的主鍵,該主鍵是EMP_ID屬性。

  3>、檢視對象視圖

DESC OV_EMPLOYEES      
SELECT VIEW_NAME,VIEW_TYPE,OID_TEXT
FROM USER_VIEWS
WHERE VIEW_NAME = 'OV_EMPLOYEES'      

  4>、查詢對象視圖

SELECT * FROM OV_EMPLOYEES      

  4、物化視圖

  前面三種視圖:關系視圖、内嵌視圖和對象視圖,實際都是通過定制查詢并利用查詢定義來擷取資料。三種視圖都不會直接存儲資料,每次操作時,都會進行編譯。物化視圖存儲實際資料,會占用一定的資料庫空間。其更接近于臨時表,但不像臨時表那樣在某個特定的時機會删除資料。物化視圖中的資料是可重用的,經常應用于讀取頻繁的場合。

  物化視圖對于大資料表的處理顯得尤為重要。為了統計一個擁有百萬級記錄的資料表的總和及平均值問題,将耗費大量資料庫資源和時間。可以通過物化視圖進行改善,對表進行一次統計,并将統計結果存儲在物化視圖中,以後每次直接查詢該視圖即可。但是物化視圖并不适合統計更新頻繁的資料,因為每次的更新都連帶更新物化視圖,所付出的代價很大。

  1>、建立物化視圖

CREATE MATERIALIZED VIEW MV_MONTHLY_SALES
       BUILD IMMEDIATE
       REFRESH ON COMMIT
       ENABLE QUERY REWRITE
AS
       SELECT SALE_MONTH,SUM(PRICE * QUANTITY)
       FROM SALES_ORDERS
       GROUP BY SALE_MONTH      

  CREATE MATERIALIZED VIEW用于建立物化視圖,物化視圖沒有REPLACE選項;BUILD IMMEDIATE要求Oracle立即編譯視圖;REFRESH ON COMMIT要求Oracle資料庫一旦基礎表的修改被送出,應自動更新視圖,以便保持視圖的資料和基礎表一緻;ENABLE QUERY REWRITE表示啟用查詢重新功能。

  2>、查詢物化視圖

SELECT * FROM MV_MONTHLY_SALES      

  3>、檢視物化視圖

SELECT MVIEW_NAME,QUERY FROM USER_VIEWS WHERE MVIEW_NAME = 'MV_MONTHLY_SALES'      

  4>、删除物化視圖

DROP MATERIALIZED VIEW MV_MONTHLY_SALES