oracle 視圖____oracle

來源:互聯網
上載者:User
資料獨立性 個人理解為,早期的應用程式所需要的資料是直接跟資料庫的表掛鈎的,如果說因為某些原因,需要將表結構修改,那麼很有可能會導致應用程式也喲啊做相應的修改。這必然會產生很大的麻煩。而如果有視圖的話,應用程式直接從視圖當中擷取資料。這個時候如果需要修改表結構的話,那麼無需在修改應用程式。只需要修改一下視圖便可。因為應用程式所需要的資料是從視圖當中擷取的。將應用程式與表分離出來,我認為就是資料獨立性。因為這個時候的資料,只是作為資料而已,而沒有任何直接的東西依賴於此資料。
視圖的優點
可以把負責的SQL語句簡單化。視圖本身其實就是一條SQL語句而已,有可能這個SQL語句非常複雜,但是一旦構成了視圖,那麼直接使用簡單的SQL語句操作視圖即可。 可以限制資料庫的訪問。通過視圖,使用者只能訪問視圖中的資料項目,而無法訪問基表中的其他的資料。 可以使資料獨立於應用程式之外。(這裡就可以認為資料的獨立性) 可以使相同的資料以不同的形式出現在不同的視圖當中。例如為每一個不同的使用者建立不同的視圖,每一個使用者看到的資料是相同的,但是列名,視圖名或許不同。
建立視圖
文法:CRETE [OR REPLACE] [FORCE | NOFORCE] VIEW 視圖名 [(別名[,別名])...] AS 子查詢語句 [WITH CHECK OPTION [CONSTRAINT 約束名]] [WITH READ ONLY] 各選項的含義如下: OR REPLACE 如果建立的視圖已經存在,oracle會重建這個視圖.也即是覆蓋. 在實際應用中,應當確認視圖是否存在,是否依然在使用當中. FORCE  不管所引用的表是否存在,oracle都會建立這個視圖. NOFORCE 只有當引用的表都存在的時候,oracle才會建立這個視圖(Oracle的預設) 視圖名 要建立的視圖的名字 別名 即將要建立的視圖的列名.列名的個數一定要與子查詢產生的額列數相等. 子查詢 一個完整的查詢語句. WITH CHECK OPTION 所插入或修改的資料行必須滿足該約束條件.也就是說,子查詢,或者為視圖插入的資料必須要滿足這個約束條件.與資料表條件約束是一樣的. 約束名 WITH CHECK OPTION 的名稱 WITH READ ONLY 保證該視圖為唯讀.也即是除了讀之外,不能在該視圖上進行插入操作等 DML 操作. 在這種子查詢語句中,不能包含 ORDER BY 字句,這是因為視圖給出的資料並不是最終的資料.. 然而我們可以在視圖上進行 ORDER BY 排序.
例如: 中文需要用""雙引號括起來
create or replace view acct  ("名字","工資","職位","僱傭日期","部門","地點")  as  select ename, sal, job, hiredate, dname, loc  from emp, dept  where emp.deptno = dept.deptno  and emp.deptno = 10;


建好視圖之後,可以利用 desc 命令來查看一下建立的視圖
desc acct

關於在視圖中取別名是因為,視圖一般都是針對非專業 IT 人員,他們需要一個更直觀的展示.
修改視圖
oracle並沒有直接修改視圖的方法,如果你想修改一個已經存在的視圖,那麼只能利用新的SQL語句,重新覆蓋已經存在的,相當於重建立一個視圖. 例如想要修改上面的視圖,以便查看更多的資料,那麼可以覆蓋

視圖建好之後,最好查看一下是否是想要的資料結構.
管理檢視
視圖一旦建立,就會儲存在oracle提供的書字典當中.通過 user_views 可以查詢到視圖資訊.


想查詢到更多的資訊, 可以使用 SELECT * FROM user_views
利用視圖查詢的時候oracle的執行步驟如下:
從資料字典當中,取出視圖的定義,也即是建立視圖的那條SQL語句. 查看該視圖引用得表的許可權. 將操作視圖的語句與視圖的定義整合成可執行檔一條SQL語句,然後執行. 引用視圖的話,會丟失一定的效率問題,從扇面可以看出,執行了2次IO操作,一次是取出視圖的定義,一次是訪問表中的資料.而IO操作對系統的效率衝擊比較大.
使用視圖進行DML操作
視圖分為2大類,簡單視圖 以及 複雜視圖.
簡單視圖 資料僅從一個表中提取 不包含函數 不包含分組函數 可以通過該視圖進行DML操作
複雜視圖 資料從多個表中提取 包含函數 包含分組函數 不一定能夠通過該視圖進行DML操作
雖然可以通過視圖進行DML操作,但是oracle加了許多的限制.在對視圖進行DML操作的時候,其實都要轉換成對所引用的表的DML操作,會影響到基表.所以對視圖進行DML的時候.有如下許多的規則
可以再簡單視圖上執行 DML 操作 如果在一個視圖中包含了分組函數,或 GROUP BY 字句,或者 DISTINCT 關鍵字,那麼就不能通過該視圖進行插入(INSERT), 修改(UPDATE), 刪除(DELETE) 操作. 如果在一個視圖中包含了由運算式組成的列,或偽列 ROWNUM. 那麼也不能通過該視圖進行插入(INSERT ), 修改(UPDATE)  操作. 如果在一個試圖中沒有包含參考資料表中那些不可為空(NOT NULL) 的列,就也不能通過該視圖進行插入(INSERT) 操作.
使用視圖的 WITH CHECK OPTION 字句
如下:
create view sales30asselect * from empwhere deptno = 30with check option constraint sales30_ck;


該視圖所引用的約束,使用了 where 字句的條件,也就是 where deptno = 30 ,視圖建立之後如果要插入 或者修改視圖中的資料, 都會受到 該約束條件的檢查,查看是否滿足 deptno = 30.如果是則成功,否則失敗.
查看視圖結構
desc sales30;
 查看視圖資料 

select * from sales30;


加入在嘗試修改該視圖當中的資料,如:
update sales30 set deptno = 10 where job = 'MANAGER';


此時就會出現異常,

oracle提示 視圖違反約束 WHERE 字句違規.說明在建立視圖的時候,使用了 WHERE 條件中的字句來當成約束.
所以 WITH CHECK OPTION CONSTRAINT 字句到的含義是:所有通過該視圖進行的 DML 操作 都不能違反了在建立視圖時用 where 自己所限定的條件.

視圖的 WITH READ ONLY
使用該字句的視圖,就是唯讀.不允許修改.
如下.建立視圖,
create or replace view acct("名字","工資","職位","僱傭日期","部門","地點")asselect ename, sal, job, hiredate, dname, locfrom emp, deptwhere emp.deptno = dept.deptnoand emp.deptno = 10with read only;


查看視圖中的 資料

修改視圖中的資料
update acct set "工資" = 9999;


修改的時候 oracle出現異常,提示無法對唯讀視圖進行 DML 操作.同樣會拒絕執行 DELETE 操作. 唯讀視圖只能讀取資料,

在建立視圖的時候,應該盡量使用 WITH READ ONLY 字句,這樣可以避免許多因為 DML 誤操作對真正的表的破壞.
刪除視圖
文法: DROP VIEW 視圖名

內嵌式視圖

如上所示,FROM 字句當中的子查詢語句就是一個內嵌式視圖. 上面是把子查詢語句放在 FROM 子句當中,並為該子查詢語句定義一個別名來定義一個內嵌式視圖. 內嵌式視圖不屬於任何使用者,也不是對象

還有一個是前 N 行查詢分析. 暫時沒去學習.

視圖應該掌握的內容為: 什麼是視圖 引入視圖的原因 什麼是資料的獨立性 怎麼利用視圖維護資料的獨立性 視圖有什麼好處,壞處 如何建立,修改,刪除視圖 從資料字典當中查看視圖 使用 WITH CHECK OPTION 以及 WITH READ ONLY 內嵌式視圖

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.