(数据库系统概论|王珊)第三章关系数据库标准语言SQL-第六、七节:视图
文章目錄
- 一:關(guān)于視圖
- (1)什么視圖
- (2)什么時候會用到視圖
- (3)視圖的作用
- 二:視圖的定義和刪除
- (1)建立視圖
- A:簡單創(chuàng)建
- B:基于多個基表的視圖
- C:基于視圖的視圖
- D:帶表達(dá)式的視圖
- E:分組視圖
- (2)刪除視圖
- 三:視圖的查詢
- 四:視圖的更新
- (1)UPDATE
- (2)INSERT
- (3)DELETE
一:關(guān)于視圖
(1)什么視圖
視圖:視圖是一個虛表,其本質(zhì)就是一條SELECT語句,而查詢結(jié)果被賦予了一個名字,也即視圖名字。或者說視圖本身不包含任何數(shù)據(jù),它只包含映射到基表的一個查詢語句,當(dāng)基表數(shù)據(jù)發(fā)生變化時,視圖數(shù)據(jù)也隨之變化。其目的就是在于方便,簡化數(shù)據(jù)操作
(2)什么時候會用到視圖
簡單點說,當(dāng)我們感覺查詢語句太過復(fù)雜且不好操控時就可以創(chuàng)建視圖,直接
SELECT * FROM [view](3)視圖的作用
- 視圖能夠簡化用戶的操作
- 視圖使用戶能以多種角度看待同一數(shù)據(jù)
- 視圖對重構(gòu)數(shù)據(jù)庫提供了一定程度的邏輯獨立性
- 視圖能夠?qū)C密數(shù)據(jù)提供安全保護(hù)
- 適當(dāng)?shù)睦靡晥D可以更清晰的表達(dá)查詢
二:視圖的定義和刪除
(1)建立視圖
語法:使用CREATE VIEW語句創(chuàng)建視圖,格式如下
- 子查詢可以是任意的SELECT語句(是可以含有ORDER BY子句和DISTINCT短語取決于具體系統(tǒng))
- 組成視圖的屬性列名要么全部省略要么全部指定,不能有第三種情況
- 如果省略視圖列名,則其列名默認(rèn)由 SELECT子句目標(biāo)列諸字段組成
A:簡單創(chuàng)建
演示:
【例1】建立信息系IS學(xué)生的視圖
CREATE VIEW IS_student AS SELECT Sno,Sname,Sage,Sdept FROM student WHERE Sdept='IS'B:基于多個基表的視圖
演示:
【例2】建立計算機科學(xué)系選修了1號課程的學(xué)生視圖
CREATE VIEW CS1 AS SELECT student.Sno Sno,Sname,Grade FROM student,sc WHERE Sdept='CS' AND student.Sno=sc.Sno AND sc.Cno='1';C:基于視圖的視圖
演示:
【例3】 建立計算機科學(xué)系選修了1號課程且成績大于95分的學(xué)生的視圖
CREATE VIEW CS2 AS SELECT * FROM CS1 WHERE Grade > 95;D:帶表達(dá)式的視圖
演示:
【例4】定義一個反映學(xué)生出生年份的視圖
CREATE VIEW birthday(Sno,Sname,Syear) AS SELECT Sno,Sname,2022-Sage FROM student;E:分組視圖
- 帶有聚集函數(shù)和GROUP BY
演示:
【例5】將學(xué)生的學(xué)號及他的平均成績定義為一個視圖
CREATE VIEW stu_grade_avg(Sno,Savg) AS SELECT Sno,AVG(Grade) FROM sc GROUP BY Sno;(2)刪除視圖
語法:格式如下,需要注意
- 基本表刪除之后,由該基本表導(dǎo)出的所有視圖均無法使用,但是視圖的定義沒有從字典中清除
三:視圖的查詢
語法:從用戶角度出發(fā),查詢視圖和查詢基本表相同;從DBMS角度出發(fā),采用視圖消解法,具體來講
- 首先進(jìn)行有效性檢查
- 接著轉(zhuǎn)換成等價的對基本表的查詢
- 最后執(zhí)行修正后的查詢
這里具體就不再做過多演示了,一般來說轉(zhuǎn)換是能成功進(jìn)行的,更多細(xì)節(jié)大家可以了解課本(這部分內(nèi)容不多)
四:視圖的更新
語法:視圖是虛表,所以對視圖的更新最終會轉(zhuǎn)化為對基本表的更新。為了防止用戶通過視圖對數(shù)據(jù)進(jìn)行更新時,有意或無意地對不屬于視圖范圍內(nèi)的基本表數(shù)據(jù)進(jìn)行操作,可以在定義視圖時加上WITH CHECK OPTION子句。這樣在更新時,如果不滿足條件,DBMS會拒絕操作
(1)UPDATE
演示:
【例6】將信息系學(xué)生視圖IS_Student中學(xué)號201215125的學(xué)生姓名改為“劉辰”
UPDATE is_student SET Sname='劉辰' WHERE Sno='201215125';【例7】如果在定義視圖is_student在定義時加入了WITH CHECK OPTION子句,接著再執(zhí)行【例6】需求
那么在更新時如果將Sdept字段改為了’MA’或其他值,DBMS就會拒絕執(zhí)行,并有下面的錯誤反饋
UPDATE is_student SET Sdept='MA' WHERE Sno='201215125';如果在更新時只修改名字,那么就沒有問題
UPDATE is_student SET Sname='德瑪' WHERE Sno='201215125';(2)INSERT
演示:
【例8】向信息系學(xué)生視圖IS_Student中插入一個新的學(xué)生記錄:201215129,趙新,20歲
INSERT INTO is_student VALUES('201215129','趙新',20);- 這里視圖沒有數(shù)據(jù),且20插入到了錯誤的地方(如果沒有WITH CHECK OPTION就會導(dǎo)致這些錯誤出現(xiàn))
- 如果假如了WITH CHECK OPTION,那么DBMS會拒絕執(zhí)行
(3)DELETE
- 刪除數(shù)據(jù)時,有無WITH CHECK OPTION都是一樣的
演示:
【例9】刪除學(xué)號為201215125的學(xué)生
DELETE FROM is_student WHERE Sno='201215125';總結(jié)
以上是生活随笔為你收集整理的(数据库系统概论|王珊)第三章关系数据库标准语言SQL-第六、七节:视图的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [C++程序设计]指针总结
- 下一篇: hdu 1500 Chopsticks