《數據庫系統概論》 -- 3.2. 視圖
概念
視圖是從一個或幾個基本表(或視圖)導出的表
視圖是一個虛表
數據庫只存放視圖的定義,不存放視圖對應的數據
視圖一經定義,就可以被查詢,刪除,但是更新操作有一定限制
定義視圖
格式 CREATE VIEW <視圖名> [(<列名>[,<列名>...])]
AS <子查詢>
[WITH CHECK OPTION];
說明
視圖的定義可以基於另一個視圖
後加WITH CHECK OPTION短語約束視圖進行更新、插入、刪除數據時,仍應該要滿足子查詢中的條件
註意 列名要麽全部指定,要麽全不指定,不指定時,使用子查詢中列名
出現下面情況,必須指定:
某個目標列為聚集函數或列表達式
多表連接時,有同名列
需要為某個列命名
分類 行列子集視圖:一個視圖是從某單個基本表導出的,只是去掉了某些行,則該視圖稱為行列子集視圖
帶表達式的視圖:一個視圖中的某屬性是基本表的某屬性經過算術/邏輯/比較運算得到的,則該視圖稱為帶表達式的視圖
分組視圖:帶有聚集函數和GROUP BY子句的查詢來定義視圖
舉例
CREATE VIEW IS_Student
AS
SELECT Sno,Sname,Sage FROM Student WHERE Sdept=‘IS‘;
建立信息系學生的視圖,並約束在進行修改和插入操作時,該視圖只有信息系學生(行列子集視圖)
CREATE VIEW IS_Student_View
AS
SELECT Sno,Sname,Sage FROM Student Where Sdept=‘IS‘
WITH CHECK OPTION;
建立信息系選修了1好課程的學生的視圖(包括學號,姓名,成績)
CRETAE VIEW IS_S1 (Sno,Sname,Grade)
AS
SELECT SC.Sno,Sname,Grade
FROM Student,SC
WHERE Student.Sno=SC.Sno AND Sdept=‘IS‘ AND SC.Cno=‘1‘;
建立信息系選修了1號課程且成績在90分以上的學生的視圖
CREATE VIEW IS_S2
AS
SELECT Sno,Sname,Grade
FROM IS_S1
WHERE Grade>=90;
定義一個反映學生出生年份的視圖(帶表達式的視圖)
CREATE VIEW BT_S(Sno,Sname,Sbirth)
AS
SELECT Sno,Sname,2017-Sage
FROM Student;
將學生的學號和平均成績定義為一個視圖(分組視圖)
CREATE VIEW S_G(Sno,Gavg)
AS
SELECT Sno,AVG(Grade)
FROM SC
GROUP BY Sno;
將Student表中的所有女生定義為一個視圖
CREATE VIEW G_Student
AS
SELECT *
FROM Student
WHERE Ssex=‘女‘;
刪除視圖
格式 DROP VIEW <視圖名> [CASCADE];
說明 視圖刪除後,視圖定義將會從數據字典中刪除
如果在該視圖的基礎上還導出了其他視圖,則使用CASCADE級聯刪除即可,否則拒絕執行
舉例 DROP VIEW BT_S; /*成功執行*/
DROP VIEW IS_S1; /*拒絕執行*/
DROP VIEW IS_SI CASCADE; /*成功執行,同時刪除IS_S2*/
查詢視圖
概念 視圖消解:在執行對視圖的查詢時,首先進行有效性檢查,檢查查詢中涉及的表、視圖是否存在,如果存在,則從數據字典中取出視圖的定義,把定義中的子查詢和用戶的查詢結合起來,轉換為對基本表的查詢,在後在執行修正後的查詢
註意 WHERE子句中聚集函數是不能做條件表達式的,但是大多數RDBS對查詢都有優化,都可以進行正確轉換
更新視圖
概念 更新視圖,是指通過視圖來插入、刪除、修改
註意 視圖是不存儲實際數據的虛表,所以對視圖的更新會經過視圖消解最終轉換為對基本表的更新
並不是所有視圖都可以更新,比如平均成績視圖
各個RDBMS的視圖更新操作需參考各RDBMS的具體實現
舉例 將信息系學生試圖IS_Student中學號為201215122的學生姓名改為劉辰--視圖之UPDATE
UPDATE IS_Student
SET Sname=‘劉辰‘
WHERE Sno=‘201215122‘;
向信息系學生視圖IS_Student中插入一個新的學生記錄(‘201215129‘,‘趙新‘,20)--視圖之INSERT
INSERT INTO IS_Student
VALUES (‘201215129‘,‘趙新‘,20);
刪除信息系學生視圖IS_Student中的學號為201215129的學生記錄--視圖之DELETE
DELETE FROM IS_Student
WHERE Sno=‘201215129‘;
視圖的作用
簡化用戶操作
以多種角度看待同一數據
對重構數據庫(對數據庫進行新增基本表,或修改基本表)提供了一定的邏輯獨立性(不影響用戶的應用程序)
對機密數據提供安全保護(如全校所有學生的信息都在一個表裏,但是給每個學院創建各自的視圖,則每個學員只能看到自己學院的數據)
適當利用視圖,查詢語句更清晰
《數據庫系統概論》 -- 3.2. 視圖