1. 程式人生 > >資料庫系統概論學習筆記(六):SQL的簡單應用之試檢視

資料庫系統概論學習筆記(六):SQL的簡單應用之試檢視

資料邏輯獨立的一種解決方案 —— 檢視

“檢視”,可以視為關係資料庫模式結構中的外模式。其作用主要是:

①、簡化使用者的操作。DBA通過檢視,可以過濾掉與使用者無關的資訊,讓使用者更加專注於其工作的內容。

②、使使用者能夠以多種角度看待同一資料。這一作用主要針對擁有多種種類的DBS。

③、對重構資料庫提供了一定程度的邏輯獨立性支援。

④、能夠對機密資料提供安全保護。這個功能其實是對第一個功能的另一個應用,即DBA可以通過建立檢視,僅提供使用者其許可權所允許的資料。

⑤、適當的利用檢視可以更清晰的表達查詢。

定義檢視

在資料庫中僅儲存了檢視的定義,並不會儲存檢視內的資料。對檢視的操作,最終會通過檢視消解轉換成對基本表的操作。

建立檢視

SQL語言格式:

CREATE [ OR REPLACE ] VIEW <檢視名> [ ( <列名>, <列名>, … ) ]
AS <子查詢>
[ WITH CHECK OPTION ]

The CREATE VIEW statement creates a new view, or replaces an existing view if the OR REPLACE clause is given. If the view does not exist, CREATE OR REPLACE VIEW is the same as CREATE VIEW. If the view does exist, CREATE OR REPLACE VIEW is the same as ALTER VIEW.

MySQL中,當檢視 v 不存在時,CREATE VIEW 和 CREATE OR REPLACE 的語義是一樣的意思。但是當 v 存在時 CREATE OR REPLACE 就相當於 ALTER VIEW。

ORDER BY is permitted in a view definition, but it is ignored if you select from a view using a statement that has its own ORDER BY.

這與教材上說的不同,在MySQL中,建立檢視時是可以使用 ORDER BY 語句的,但是當在一個已經通過ORDER BY建立的檢視 v1 之上建立檢視 v2 時,定義檢視的語句中的“ORDER BY”將被忽略。

說了這麼多,開始上例子:

例1、建立資訊系學生的檢視。

CREATE VIEW IS_Student
AS
SELECT Sno,Sname,Sage
FROM Student
WHERE Sdept = 'IS';

Create View 1
 

例2、建立資訊系學生的檢視,並要求進行修改和插入時仍需保證該檢視只有資訊系的學生。

CREATE OR REPLACE VIEW IS_Student
AS
SELECT Sno,Sname,Sage
FROM Student
WHERE Sdept = 'IS'
WITH CHECK OPTION;

Create View 2

WITH CHECK OPTION:表示對檢視進行UPDATE、INSERT、DELETE時,要保證滿足檢視定義中的謂詞條件。

以上皆為由單表匯出的行列子檢視。檢視還可以建立在多張表以及檢視之上。

例3、建立資訊系選修了1號課程且成績在90分以上的學生的檢視。

由於例2中已經用“WITH CHECK OPTION”定義了檢視IS_Student,也就是說如果我們使用IS_Student為基礎定義新檢視,就會自動限制在“ WHERE Sdept = ‘IS’ ”條件下。

CREATE VIEW IS_S2
AS
SELECT IS_Student.Sno,Sname,Grade
FROM IS_Student,SC
WHERE IS_Student.Sno = SC.Sno;

Create View 3
 

為了減少資料庫的冗餘資料,且能夠儘量減少使用者的操作,並專注於其工作內容,往往會定義一些代表達式的檢視。

例4、定義一個反映學生出生年份的檢視。

CREATE VIEW BT_S(Sno,Sname,Sbirth)
AS
SELECT Sno,Sname,2017-Sage
FROM Student;

Create View 4

刪除檢視

SQL語句格式:

DROP VIEW <檢視名>,<檢視名>,…

在MySQL中,同樣該語句後面可以加上“RESTRICT”或“CASCADE”,但是依然沒什麼卵用。

RESTRICT and CASCADE, if given, are parsed and ignored.

例5、刪除前面例子所建檢視“BT_S”和“IS_S2”。

DROP VIEW BT_S,IS_S2;

Drop View 5
 

查詢檢視

正如我使用SHOW TABLES來檢視檢視存不存在一樣,當檢視建立好之後,幾乎就能當做表來用了。

例6、教材上說某些關係資料庫並不能對包涵聚集函式的檢視進行正確的查詢轉換,那麼我們就測試一下MySQL可不可以做到。

首先,建立一個各學院學生平均年齡的檢視S_A。

CREATE VIEW S_A(Sno,Avg_Age)
AS
SELECT Sdept,AVG(Sage)
FROM Student
GROUP BY Sdept;

然後,查詢學生平均年齡在20歲以上的學院。

SELECT * FROM S_A
WHERE Avg_Age >= 20;

結果如下:
Select View 6

該例說明MySQL是可以進行正確轉換的,請放心使用。

更新檢視

由於檢視並不是表,所以對其進行的更新操作同樣會經過檢視消解轉化成對基本表的操作。

另外,為了避免使用者對檢視進行更新操作時,更新了不屬於檢視範圍內的資料,故強烈推薦在檢視定義時加上“WITH CHECK OPTION”。

MySQL關於View的更新操作還蠻多的,儘量不用檢視更新就好了,嘿嘿嘿……