前言
本節內容來源于資料庫系統概論(第五版)王珊,薩師煊編著!
本節內容是由于今天我上資料庫課的時候對視圖的一直有一個疑問——視圖和表的查詢一樣,為什么用戶不直接使用表,還要在建一個視圖?因為這個問題,我就從書上尋找,帶著疑問我是尋找到我想要的答案,而且我還把視圖給大概的分類,然后我就寫了這篇博客!!希望能幫助大家!!!
目錄
1.視圖的介紹
2.視圖的作用
3.定義視圖
①建立視圖
視圖格式
列子集視圖:
多種視圖:
②洗掉視圖
4.查詢視圖
5.更新視圖
1.視圖的介紹
首先我們需要直到視圖是什么???
答:視圖是從一個表或者幾個表(或視圖)匯出的表,它于基本表不同,是一個虛表,資料庫中只存放視圖的定義,而不存放視圖對應的資料,這些資料仍存放在原來的基本表中,所以一旦基本表中的資料發生變化,從視圖中查詢的出的資料也就隨之改變,
2.視圖的作用
| ①視圖能簡化用戶的操作, |
| ②視圖能以多種角度看待同一資料, |
| ③視圖對重構資料庫提供了一定程度的邏輯獨立性, |
| ④視圖能夠對機密資料提供安全保護, |
| ⑤適當利用視圖可以更清晰地表達查詢, |
3.定義視圖
①建立視圖
視圖格式
SQL語言用create view 命令建立視圖,其一般格式為:
create view<視圖名>[(<列名>[,<列名>]...)]
as <子查詢>
with check option;
其中,子查詢可以是任意的select陳述句,是否可以含有 order by 子句和 distinct短語,則取決于具體的系統實作,
with check option 表示對視圖進行updat,insert,delete操作時要保證更新,插入或洗掉的行滿足視圖定義的謂詞條件(即子查詢中的條件運算式),
注意:組成視圖的屬性列名或者全部省略或者全部指定,沒有第三種選擇,
以下三種情況必須明確指定組成視圖的所有列名:
某個目標列是聚集函式或列運算式 多表連接時選出了幾個同名列作為視圖的欄位 需要在視圖中為某個列啟用新的更合適的名字
關系資料庫管理系統執行CREATE VIEW陳述句時只是把視圖定義存入資料字典,并不執行其中的SELECT陳述句,
列子集視圖:
若一個視圖是從單個基本表匯出的,并且只是去掉了基本表的某些行和某些列,但保留了主碼,我們稱這類視圖為行列子集視圖
多種視圖:
多個表的視圖:
CREATE VIEW IS_S1(Sno,Sname,Grade)
AS
SELECT Student.Sno,Sname,Grade
FROM Student,SC
WHERE Sdept= 'IS' AND
Student.Sno=SC.Sno AND
SC.Cno= '1';
基于視圖的視圖
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,2014-Sage
FROM Student;
分組視圖
CREAT VIEW S_G(Sno,Gavg)
AS
SELECT Sno,AVG(Grade)
FROM SC
GROUP BY Sno;
②洗掉視圖
陳述句的格式:
DROP VIEW <視圖名>[CASCADE];
該陳述句從資料字典中洗掉指定的視圖定義,
如果該視圖上還匯出了其他視圖,使用CASCADE級聯洗掉陳述句,把該視圖和由它匯出的所有視圖一起洗掉,
洗掉基表時,由該基表匯出的所有視圖定義都必須顯式地使用DROP VIEW陳述句洗掉,
要洗掉IS_S1,需使用級聯洗掉:
DROP VIEW IS_S1 CASCADE;
4.查詢視圖
視圖定義后,用戶就可以向對基本表一樣的對視圖經行查詢了,
用戶角度:查詢視圖與查詢基本表相同
什么是視圖消解??
我們用下面三句話直接概括!!!
| 進行有效性檢查, |
| 轉換成等價的對基本表的查詢, |
| 執行修正后的查詢, |
[例] 在資訊系學生的視圖中找出年齡小于20歲的學生,
SELECT Sno,Sage
FROM IS_Student
WHERE Sage<20;
視圖消解轉換后的查詢陳述句為
SELECT Sno,Sage
FROM Student
WHERE Sdept= 'IS' AND Sage<20;
視圖消解法的局限
有些情況下,視圖消解法不能生成正確的查詢,
在S_G視圖中查詢平均成績在90分以上的學生學號和平均成績
SELECT *
FROM S_G
WHERE Gavg>=90;
S_G視圖的子查詢定義:
CREATE VIEW S_G (Sno,Gavg)
AS
SELECT Sno,AVG(Grade)
FROM SC
GROUP BY Sno;
錯誤:
SELECT Sno,AVG(Grade)
FROM SC
WHERE AVG(Grade)>=90
GROUP BY Sno;
正確:
SELECT Sno,AVG(Grade)
FROM SC
GROUP BY Sno
HAVING AVG(Grade)>=90;
5.更新視圖
更新視圖是指通過視圖又 來插入(INSERT)、 洗掉(DELETE)和修改(UPDATE)資料,
由于視圖是不不實際存盤資料的虛表,因此對視圖的更新最終要轉換為對基本表的更新,像查詢視圖那樣,對視圖的更新操作也是通過視圖消解,轉換為對基本表的更新操作,
為防止用戶通過視圖對資料進行增加、洗掉、修改時,有意無意地對不屬于視圖范圍 內的基本表資料進行操作,可在定義視圖時加上WITH CHECK OPTION子句,這樣在視圖上增、刪、改資料時,關系資料庫管理系統會檢查視圖定義中的條件,若不滿足條件則拒絕執行該操作,
[例] 將資訊系學生視圖IS_Student中學號”201215122”的學生姓名改為”劉辰”,
UPDATE IS_Student
SET Sname= '劉辰'
WHERE Sno= ' 201215122 ';
轉換后的陳述句:
UPDATE Student
SET Sname= '劉辰'
WHERE Sno= ' 201215122 ' AND Sdept= 'IS';
更新視圖的限制:
一些視圖是不可更新的,因為對這些視圖的更新不能唯一地有意義地轉換成對相應基本表的更新
例:視圖S_G為不可更新視圖,
UPDATE S_G
SET Gavg=90
WHERE Sno= '201215121';
這個對視圖的更新無法轉換成對基本表SC的更新
一般地,行列子集視圖是可更新的,除行列子集視圖外,有些視圖理論上是可更新的,
但它們的確切特征還是尚待研究的課題,還有些視圖從理論上就是不可更新的,
目前,各個關系資料庫管理系統般都只允許對行列子集視圖進行更新 而且各個系統對視圖的更新還有更進一步的規定,由于各系統實作方法上的差異,這些規定也不盡相同,
例如DB2的規定:
| 若視圖是由兩個以上基本表匯出的,則此視圖不允許更新, |
| 若視圖的欄位來自欄位運算式或常數,則不允許對此視圖執行INSERT和UPDATE操作,但允許執行DELETE操作, |
| 若視圖的欄位來自集函式,則此視圖不允許更新, |
| 若視圖定義中含有GROUP BY子句,則此視圖不允許更新, |
| 若視圖定義中含有DISTINCT短語,則此視圖不允許更新, |
| 若視圖定義中有嵌套查詢,并且內層查詢的FROM子句中涉及的表也是匯出該視圖的基本表,則此視圖不允許更新, |
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/339252.html
標籤:其他
上一篇:在運行時更改屬性的可瀏覽性
