視圖是從一個(gè)或幾個(gè)基本表(或視圖)導(dǎo)出的表。它與基本表不同,是一個(gè)虛表。數(shù)據(jù)庫只存放視圖的定義,而不存放視圖對(duì)應(yīng)的數(shù)據(jù),這些數(shù)據(jù)仍存放在原來的基本表中。所以基本表中的數(shù)據(jù)發(fā)生變化,從視圖中查詢出的數(shù)據(jù)也就隨之改變了。從這個(gè)意義上講,視圖就像一個(gè)窗口,透過它可以看到數(shù)據(jù)庫中自己感興趣的數(shù)據(jù)及其變化。
既然視圖的定義是基于基本表的,哪為什么還要定義視圖呢?這是因?yàn)楹侠淼厥褂靡晥D能夠帶來許多好處:
1、 視圖能簡(jiǎn)化用戶操作
視圖機(jī)制使用戶可以將注意力集中在所關(guān)心地?cái)?shù)據(jù)上。如果這些數(shù)據(jù)不是直接來自基本表,則可以通過定義視圖,使數(shù)據(jù)庫看起來結(jié)構(gòu)簡(jiǎn)單、清晰,并且可以簡(jiǎn)化用戶的的數(shù)據(jù)查詢操作。例如,那些定義了若干張表連接的視圖,就將表與表之間的連接操作對(duì)用戶隱藏起來了。換句話說,用戶所作的只是對(duì)一個(gè)虛表的簡(jiǎn)單查詢,而這個(gè)虛表是怎樣得來的,用戶無需了解。
2、 視圖使用戶能以多種角度看待同一數(shù)據(jù)
視圖機(jī)制能使不同的用戶以不同的方式看待同一數(shù)據(jù),當(dāng)許多不同種類的用戶共享同一個(gè)數(shù)據(jù)庫時(shí),這種靈活性是非常必要的。
3、 視圖對(duì)重構(gòu)數(shù)據(jù)庫提供了一定程度的邏輯獨(dú)立性
數(shù)據(jù)的物理獨(dú)立性是指用戶的應(yīng)用程序不依賴于數(shù)據(jù)庫的物理結(jié)構(gòu)。數(shù)據(jù)的邏輯獨(dú)立性是指當(dāng)數(shù)據(jù)庫重構(gòu)造時(shí),如增加新的關(guān)系或?qū)υ械年P(guān)系增加新的字段,用戶的應(yīng)用程序不會(huì)受影響。層次數(shù)據(jù)庫和網(wǎng)狀數(shù)據(jù)庫一般能較好地支持?jǐn)?shù)據(jù)的物理獨(dú)立性,而對(duì)于邏輯獨(dú)立性則不能完全的支持。
在關(guān)許數(shù)據(jù)庫中,數(shù)據(jù)庫的重構(gòu)造往往是不可避免的。重構(gòu)數(shù)據(jù)庫最常見的是將一個(gè)基本表“垂直”地分成多個(gè)基本表。例如:將學(xué)生關(guān)系Student(Sno,Sname,Ssex,Sage,Sdept),
分為SX(Sno,Sname,Sage)和SY(Sno,Ssex,Sdept)兩個(gè)關(guān)系。這時(shí)原表Student為SX表和SY表自然連接的結(jié)果。如果建立一個(gè)視圖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;
這樣盡管數(shù)據(jù)庫的邏輯結(jié)構(gòu)改變了(變?yōu)镾X和SY兩個(gè)表了),但應(yīng)用程序不必修改,因?yàn)樾陆⒌囊晥D定義為用戶原來的關(guān)系,使用戶的外模式保持不變,用戶的應(yīng)用程序通過視圖仍然能夠查找數(shù)據(jù)。
當(dāng)然,視圖只能在一定程度上提供數(shù)據(jù)的邏輯獨(dú)立,比如由于視圖的更新是有條件的,因此應(yīng)用程序中修改數(shù)據(jù)的語句可能仍會(huì)因?yàn)榛颈順?gòu)造的改變而改變。
4、視圖能夠?qū)C(jī)密數(shù)據(jù)提供安全保護(hù)
有了視圖機(jī)制,就可以在設(shè)計(jì)數(shù)據(jù)庫應(yīng)用系統(tǒng)時(shí),對(duì)不同的用戶定義不同的視圖,使機(jī)密數(shù)據(jù)不出現(xiàn)在不應(yīng)該看到這些數(shù)據(jù)的用戶視圖上。這樣視圖機(jī)制就自動(dòng)提供了對(duì)機(jī)密數(shù)據(jù)的安全保護(hù)功能。例如,Student表涉及全校15個(gè)院系學(xué)生數(shù)據(jù),可以在其上定義15個(gè)視圖,每個(gè)視圖只包含一個(gè)院系的學(xué)生數(shù)據(jù),并只允許每個(gè)院系的主任查詢和修改本原系學(xué)生視圖。
5、適當(dāng)?shù)睦靡晥D可以更清晰地表達(dá)查詢
例如經(jīng)常需要執(zhí)行這樣的查詢“對(duì)每個(gè)學(xué)生找出他獲得最高成績(jī)的課程號(hào)”??梢韵榷x一個(gè)視圖,求出每個(gè)同學(xué)獲得的最高成績(jī):
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;
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)
點(diǎn)擊舉報(bào)。