Oracle-視圖

Oracle-視圖

在項目開發中,有時候會用到多表查詢,有不少種方法,好比關聯,好比視圖,但對於查詢來講,視圖查詢是最快的,若是你的數據庫的字段信息不少,那查詢就得整表查,好比兩表查詢,咱們就能夠把要的字段抽取出來,放在視圖中,這樣查詢時就只要查詢視圖中所要的字段。先看個示例:數據庫

  1. 建立視圖
CREATE OR REPLACE VIEW OMBROMETERDATA_MONITORPOINT  
AS  
SELECT O.VALUEDAY,O.VALUEHOUR,O.VALUEMONTH,O.VALUEYEAR,O.DTIME ,O.PROJECTID ,M.ID,M.NAME
FROM OMBROMETERDATA O, MONITORPOINT M  
WHERE O.POINTNAME=M.NAME;

①.OR REPLACE :若所建立的試圖已經存在,ORACLE自動重建該視圖;安全

②.OMBROMETERDATA和MONITORPOINT關聯的兩個表的表名,OMBROMETERDATA_MONITORPOINT爲自定義的視圖名稱設計

2.使用視圖查詢code

SELECT * FROM OMBROMETERDATA_MONITORPOINT

1、視圖的概念

視圖是基於一張表或多張表或另一個視圖的邏輯表。視圖不一樣於表,視圖自己不包含任何數據。表是實際獨立存在的實體,是用於存儲數據的基本結構。而視圖只是一種定義,對應一個查詢語句。視圖的數據都來自於某些表,這些表被稱爲基表。經過視圖來查看錶,就像是從不一樣的角度來觀察一個(或多個)表。
視圖有以下一些優勢:
① 能夠提升數據訪問的安全性,經過視圖每每只能夠訪問數據庫中表的特定部分,限制了用戶訪問表的所有行和列。
②簡化了對數據的查詢,隱藏了查詢的複雜性。視圖的數據來自一個複雜的查詢,用戶對視圖的檢索卻很簡單。
③一個視圖能夠檢索多張表的數據,所以用戶經過訪問一個視圖,可完成對多個表的訪問。
④視圖是相同數據的不一樣表示,經過爲不一樣的用戶建立同一個表的不一樣視圖,使用戶可分別訪問同一個表的不一樣部分。
視圖能夠在表可以使用的任何地方使用,但在對視圖的操做上同表相比有些限制,特別是插入和修改操做。對視圖的操做將傳遞到基表,因此在表上定義的約束條件和觸發器在視圖上將一樣起做用。對象

2、視圖的建立

建立視圖須要CREAE VIEW系統權限,視圖的建立語法以下:開發

CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW 視圖名[(別名1[,別名2...])] 
AS 子查詢 
[WITH CHECK OPTION [CONSTRAINT 約束名]] 
[WITH READ ONLY]

其中:編譯

  1. OR REPLACE 表示替代已經存在的視圖。
  2. FORCE表示無論基表是否存在,建立視圖。
  3. NOFORCE表示只有基表存在時,才建立視圖,是默認值。
  4. 別名是爲子查詢中選中的列新定義的名字,替代查詢表中原有的列名。
  5. 子查詢是一個用於定義視圖的SELECT查詢語句,能夠包含鏈接、分組及子查詢。
  6. WITH CHECK OPTION表示進行視圖插入或修改時必須知足子查詢的約束條件。後面的約束名是該約束條件的名字。
  7. WITH READ ONLY 表示視圖是隻讀的。

1.建立簡單視圖

建立圖書做者視圖。

步驟1:建立圖書做者視圖:

CREATE VIEW 圖書做者(書名,做者)   
        AS SELECT 圖書名稱,做者 FROM 圖書;

步驟2:查詢視圖所有內容

SELECT * FROM 圖書做者;

輸出結果:程序設計


書名 做者原理

-------------------------------- --------------------  
    計算機原理                     劉勇  
     C語言程序設計                馬麗  
    彙編語言程序設計               黃海明

步驟3:查詢部分視圖:

SELECT 做者 FROM 圖書做者;

輸出結果:軟件


做者

----------  
    劉勇  
    馬麗  
    黃海明

說明:本訓練建立的視圖名稱爲「圖書做者」,視圖只包含兩列,爲「書名」和「做者」,對應圖書表的「圖書名稱」和「做者」兩列。若是省略了視圖名稱後面的列名,則視圖會採用和表同樣的列名。對視圖查詢和對錶查詢同樣,但經過視圖最多隻能看到表的兩列,可見視圖隱藏了表的部份內容。

建立清華大學出版社的圖書視圖。

步驟1:建立清華大學出版社的圖書視圖:

CREATE VIEW 清華圖書   
AS SELECT 圖書名稱,做者,單價 FROM 圖書 WHERE 出版社編號= '01';

步驟2:查詢圖書視圖:

SELECT * FROM 清華圖書;

執行結果:


圖書名稱 做者 單價


計算機原理                     劉勇             25.3

步驟3:刪除視圖:

DROP VIEW 清華圖書;

2.建立複雜視圖

修改做者視圖,加入出版社名稱。

步驟1:重建圖書做者視圖:

CREATE OR REPLACE VIEW 圖書做者(書名,做者,出版社)   
        AS SELECT 圖書名稱,做者,出版社名稱 FROM 圖書,出版社   
        WHERE 圖書.出版社編號=出版社.編號;

步驟2:查詢新視圖內容:

SELECT * FROM 圖書做者;

輸出結果:


書名 做者 出版社

-------------------------------------------- ---------- ----------------------------  
    計算機原理               劉勇       清華大學出版社  
    C語言程序設計         馬麗       電子科技大學出版社  
    彙編語言程序設計     黃海明     電子科技大學出版社

說明:本訓練中,使用了OR REPLACE選項,使新的視圖替代了同名的原有視圖,同時在查詢中使用了相等鏈接,使得視圖的列來自於兩個不一樣的基表。

建立一個統計視圖。

步驟1:建立emp表的一個統計視圖:

CREATE VIEW 統計表(部門名,最大工資,最小工資,平均工資)  
        AS SELECT DNAME,MAX(SAL),MIN(SAL),AVG(SAL) FROM EMP E,DEPT D  
        WHERE E.DEPTNO=D.DEPTNO GROUP BY DNAME;

步驟2:查詢統計表:

SELECT * FROM 統計表;

執行結果:


部門名 最大工資 最小工資 平均工資

-------------------------- --------------- ----------------- ------------------  
    ACCOUNTING          5000       1300        3050  
    RESEARCH             3000        800        2175  
    SALES                  2850        950   1566.66667

說明:本訓練中,使用了分組查詢和鏈接查詢做爲視圖的子查詢,每次查詢該視圖均可以獲得統計結果。

建立只讀視圖

建立只讀視圖要用WITH READ ONLY選項。
建立只讀視圖。

步驟1:建立emp表的經理視圖:

CREATE OR REPLACE VIEW manager   
        AS SELECT * FROM emp WHERE job= 'MANAGER'  
        WITH READ ONLY;

步驟2:進行刪除:

DELETE FROM manager;

執行結果:
ERROR 位於第 1 行:
ORA-01752: 不能從沒有一個鍵值保存表的視圖中刪除

4.建立基表不存在的視圖

正常狀況下,不能建立錯誤的視圖,特別是當基表還不存在時。但使用FORCE選項就能夠在建立基表前先建立視圖。建立的視圖是無效視圖,當訪問無效視圖時,Oracle將從新編譯無效的視圖。
使用FORCE選項建立帶有錯誤的視圖:

CREATE FORCE VIEW 班幹部 AS SELECT * FROM 班級 WHERE 職務 IS NOT NULL;

執行結果:
警告: 建立的視圖帶有編譯錯誤。

視圖的操做

對視圖常常進行的操做是查詢操做,但也能夠在必定條件下對視圖進行插入、刪除和修改操做。對視圖的這些操做最終傳遞到基表。可是對視圖的操做有不少限定。若是視圖設置了只讀,則對視圖只能進行查詢,不能進行修改操做。

1.視圖的插入

視圖插入練習。
步驟1:建立清華大學出版社的圖書視圖:

CREATE OR REPLACE VIEW 清華圖書   
        AS SELECT * FROM 圖書 WHERE 出版社編號= '01';

步驟2:插入新圖書:

INSERT INTO 清華圖書 VALUES('A0005','軟件工程','01','馮娟',5,27.3);

步驟3:顯示視圖:

SELECT * FROM 清華圖書;

執行結果:


圖書 圖書名稱 出 做者 數量 單價

-------- ---------------------------------------- ----------- -------- ------------------------ --------------  
    A0001 計算機原理                     01 劉勇                5       25.3

A0005 軟件工程 01 馮娟 5 27.3


步驟4:顯示基表

SELECT * FROM 圖書;

執行結果:


圖書 圖書名稱 出 做者 數量 單價

-------- ------------------------------------------ ------- ---------------- ----------------- ---------------  
    A0001 計算機原理           01 劉勇        5        25.3  
    A0002  C語言程序設計        02 馬麗    1       18.75  
    A0003 彙編語言程序設計     02 黃海明       15       20.18  
    A0005 軟件工程              01 馮娟        5        27.3

說明:經過查看視圖,可見新圖書插入到了視圖中。經過查看基表,看到該圖書也出如今基表中,說明成功地進行了插入。新圖書的出版社編號爲「01」,仍然屬於「清華大學出版社」。
可是有一個問題,就是若是在「清華圖書」的視圖中插入其餘出版社的圖書,結果會怎麼樣呢?結果是容許插入,可是在視圖中看不見,在基表中能夠看見,這顯然是不合理的。

2.使用WITH CHECK OPTION選項

爲了不上述狀況的發生,可使用WITH CHECK OPTION選項。使用該選項,能夠對視圖的插入或更新進行限制,即該數據必須知足視圖定義中的子查詢中的WHERE條件,不然不容許插入或更新。好比「清華圖書」視圖的WHERE條件是出版社編號要等於「01」(01是清華大學出版社的編號),因此若是設置了WITH CHECK OPTION選項,那麼只有出版社編號爲「01」的圖書才能經過清華視圖進行插入。
使用WITH CHECK OPTION選項限制視圖的插入。
步驟1:重建清華大學出版社的圖書視圖,帶WITH CHECK OPTION選項:

CREATE OR REPLACE VIEW 清華圖書   
        AS SELECT * FROM 圖書 WHERE 出版社編號= '01'  
        WITH CHECK OPTION;

步驟2:插入新圖書:

INSERT INTO 清華圖書 VALUES('A0006','Oracle數據庫','02','黃河',3,39.8);

執行結果:
ERROR 位於第 1 行:
ORA-01402: 視圖 WITH CHECK OPTIDN 違反 where 子句
說明:可見經過設置了WITH CHECK OPTION選項,「02」出版社的圖書插入受到了限制。若是修改已有圖書的出版社編號狀況會如何?答案是將一樣受到限制。要是刪除視圖中已有圖書,結果又將怎樣呢?答案是能夠,由於刪除並不違反WHERE條件。

3.來自基表的限制

除了以上的限制,基表自己的限制和約束也必需要考慮。若是生成子查詢的語句是一個分組查詢,或查詢中出現計算列,這時顯然不能對錶進行插入。另外,主鍵和NOT NULL列若是沒有出如今視圖的子查詢中,也不能對視圖進行插入。在視圖中插入的數據,也必須知足基表的約束條件。
基表自己限制視圖的插入。
步驟1:重建圖書價格視圖:

CREATE OR REPLACE VIEW 圖書價格   
        AS SELECT 圖書名稱,單價 FROM 圖書;

步驟2:插入新圖書:

INSERT INTO 圖書價格 VALUES('Oracle數據庫',39.8);

執行結果:
ERROR 位於第 1 行:
ORA-01400: 沒法將 NULL 插入 ("SCOTT"."圖書"."圖書編號")
說明:在視圖中沒有出現的基表的列,在對視圖插入時,自動默認爲NULL。該視圖只有兩列能夠插入,其餘列將默認爲空。插入出錯的緣由是,在視圖中不能插入圖書編號,而圖書編號是圖書表的主鍵,是必須插入的列,不能爲空,這就產生了矛盾。

3、視圖的查看

USER_VIEWS字典中包含了視圖的定義。
USER_UPDATABLE_COLUMNS字典包含了哪些列能夠更新、插入、刪除。
USER_OBJECTS字典中包含了用戶的對象。
能夠經過DESCRIBE命令查看字典的其餘列信息。在這裏給出一個訓練例子。
查看清華圖書視圖的定義:

SELECT TEXT FROM USER_VIEWS WHERE VIEW_NAME='清華圖書';

執行結果:


TEXT

-----------------------------------------------------------------------------------------------  
    SELECT 圖書名稱,做者,單價 FROM 圖書 WHERE 出版社編號='01'

查看用戶擁有的視圖:

SELECT object_name FROM user_objects WHERE object_type='VIEW';

執行結果:


OBJECT_NAME

----------------------------------------------------------------------------------------------  
    清華圖書  
    圖書做者

4、刪除視圖

刪除視圖的語法以下:

DROP VIEW 視圖名;

刪除視圖者須要是視圖的創建者或者擁有DROP ANY VIEW權限。視圖的刪除不影響基表,不會丟失數據。

相關文章
相關標籤/搜索