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