1. 程式人生 > >《數據庫系統概論》 -- 3.2. 視圖

《數據庫系統概論》 -- 3.2. 視圖

avg style 女生 結合 ade ins 數據庫系統 order by 存在

概念

視圖是從一個或幾個基本表(或視圖)導出的表

視圖是一個虛表

數據庫只存放視圖的定義,不存放視圖對應的數據

視圖一經定義,就可以被查詢,刪除,但是更新操作有一定限制

定義視圖

格式 CREATE VIEW <視圖名> [(<列名>[,<列名>...])]

AS <子查詢>

[WITH CHECK OPTION];

說明

子查詢可以是任意的SELECT語句,是否可以包含ORDER BY子句和DISTINCT短語,取決於具體系統;

視圖的定義可以基於另一個視圖

後加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. 視圖