1. 程式人生 > >【PL/SQL查詢】視圖_view

【PL/SQL查詢】視圖_view

還要 不變 creat 數據庫 表連接 alt sql查詢 結果 技術分享

轉自:http://database.e800.com.cn/articles/2009/719/1248015564465_1.html

  視圖是從一個或幾個基本表(或視圖)導出的表。它與基本表不同,是一個虛表。數據庫只存放視圖的定義,而不存放視圖對應的數據,這些數據仍存放在原來的基本表中。所以基本表中的數據發生變化,從視圖中查詢出的數據也就隨之改變了。從這個意義上講,視圖就像一個窗口,透過它可以看到數據庫中自己感興趣的數據及其變化。

既然視圖的定義是基於基本表的,哪為什麽還要定義視圖呢?這是因為合理地使用視圖能夠帶來許多好處:

1、 視圖能簡化用戶操作

  視圖機制使用戶可以將註意力集中在所關心地數據上。如果這些數據不是直接來自基本表,則可以通過定義視圖,使數據庫看起來結構簡單、清晰,並且可以簡化用戶的的數據查詢操作。例如,那些定義了若幹張表連接的視圖,就將表與表之間的連接操作對用戶隱藏起來了。換句話說,用戶所作的只是對一個虛表的簡單查詢,而這個虛表是怎樣得來的,用戶無需了解。

2、 視圖使用戶能以多種角度看待同一數據

  視圖機制能使不同的用戶以不同的方式看待同一數據,當許多不同種類的用戶共享同一個數據庫時,這種靈活性是非常必要的。

3、 視圖對重構數據庫提供了一定程度的邏輯獨立性

  數據的物理獨立性是指用戶的應用程序不依賴於數據庫的物理結構。數據的邏輯獨立性是指當數據庫重構造時,如增加新的關系或對原有的關系增加新的字段,用戶的應用程序不會受影響。層次數據庫和網狀數據庫一般能較好地支持數據的物理獨立性,而對於邏輯獨立性則不能完全的支持。

  在關許數據庫中,數據庫的重構造往往是不可避免的。重構數據庫最常見的是將一個基本表“垂直”地分成多個基本表。例如:將學生關系Student(Sno,Sname,Ssex,Sage,Sdept),

分為SX(Sno,Sname,Sage)和SY(Sno,Ssex,Sdept)兩個關系。這時原表Student為SX表和SY表自然連接的結果。如果建立一個視圖Student:
CREATE VIEW Student(Sno,Sname,Ssex,Sage,Sdept) AS SELECT SX.Sno,SX.Sname,SY.Ssex,SX.Sage,SY.Sdept FROM SX,SY WHERE SX.Sno=SY.Sno;

  這樣盡管數據庫的邏輯結構改變了(變為SX和SY兩個表了),但應用程序不必修改,因為新建立的視圖定義為用戶原來的關系,使用戶的外模式保持不變,用戶的應用程序通過視圖仍然能夠查找數據。


當然,視圖只能在一定程度上提供數據的邏輯獨立,比如由於視圖的更新是有條件的,因此應用程序中修改數據的語句可能仍會因為基本表構造的改變而改變。

4、視圖能夠對機密數據提供安全保護

  有了視圖機制,就可以在設計數據庫應用系統時,對不同的用戶定義不同的視圖,使機密數據不出現在不應該看到這些數據的用戶視圖上。這樣視圖機制就自動提供了對機密數據的安全保護功能。例如,Student表涉及全校15個院系學生數據,可以在其上定義15個視圖,每個視圖只包含一個院系的學生數據,並只允許每個院系的主任查詢和修改本原系學生視圖。

5、適當的利用視圖可以更清晰地表達查詢

  例如經常需要執行這樣的查詢“對每個學生找出他獲得最高成績的課程號”。可以先定義一個視圖,求出每個同學獲得的最高成績:
CREATE VIEW VMGRADE AS SELECT Sno,MAX(Grade) Mgrade FROM SC GROUP BY Sno;
然後用如下的查詢語句完成查詢:
SELECT SC.Sno,Cno FROM SC,VMGRADE WHERE SC.Sno = VMGRADE.Sno AND SC.Grade = VMGRADE.Mgrade;

對視圖的修改:

  1. 單表視圖一般用於查詢和修改,會改變基本表的數據,

2. 多表視圖一般用於查詢,不會改變基本表的數據。

  技術分享圖片

【PL/SQL查詢】視圖_view