視圖是資料庫中特有的對象,視圖用于存儲查詢,但不會存儲資料(物化視圖除外)。這是視圖和資料表的重要差別。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