sql檢視
概述
檢視,可以讓我們看資料庫更簡單,檢視提供了一種可以讓我們只關注基本表的某一個方面的機制,將基本表在邏輯上重新組織,讓使用者看著更簡單,然後在這上面去做查詢和其他操作。
檢視是外模式的概念,可以從使用者角度重新組織資料庫,讓使用者使用起來更方便,而從檢視到基本表之間存在對映。
定義檢視
基本語法
CREATE VIEW
< 檢視名 > [(< 列名 > [ , < 列名 >]…)]
AS < 子查詢 >
[WITH CHECK OPTION];
組成檢視屬性列名:全部指定或全部省略
子查詢不允許有ORDER BY和DISTINCT語句
建立資訊系學生的檢視
CREATE VIEW IS_Student
AS
SELECT Sno, Sname, Sage
FROM student
WHERE Sdept='IS';
建立資訊系學生的檢視,並要求進行修改和插入操 作時仍需保證該檢視只有資訊系的學生
CREATE VIEW IS_Student
AS
SELECT Sno, Sname, Sage
FROM student
WHERE Sdept='IS'
WITH CHECK OPTION;
新增WITH CHECK OPTION
對檢視IS_Student更新操作:
- 修改操作:自動加上Sdept=‘IS’條件
- 刪除操作:自動加上Sdept=‘IS’條件
- 插入操作:自動檢查Sdept屬性是否為‘IS’
- 若不是,拒絕插入
- 若沒有提供Sdept值,則自動定義Sdept=‘IS’
建立資訊系選修了 1 號課程的學生檢視
基於多個表的檢視
CREATE VIEW IS_S1
AS
SELECT student.`Sno`, Sname, Grade
FROM student, sc
WHERE student.`Sdept`='IS' AND student.`Sno`=sc.`Sno` 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, 2022-Sage
FROM student;
將學生的學號及他的平均成績定義為一個檢視
分組檢視
CREATE VIEW S_G(Sno, Gavg)
AS
SELECT Sno, AVG(Grade)
FROM sc
GROUP BY (Sno);
刪除檢視
DROP VIEW <檢視名>
使用CASCADE刪除,刪除時連同由該檢視匯出的檢視一起刪除
查詢檢視
在資訊系學生的檢視中找出年齡小於 20 歲 的學生
SELECT Sno, Sname
FROM IS_Student
WHERE Sage<20;
檢視消解轉換後的查詢語句
SELECT Sno, Sname
FROM student
WHERE Sdept='IS' AND Sage<20;
查詢選修了 1 號課程的資訊系學生
SELECT IS_Student.`Sno`, Sname
FROM IS_Student, sc
WHERE sc.`Cno`='1' AND IS_Student.`Sno`=sc.`Sno`;
在 S_G 檢視中查詢平均成績在 90 分以上的學生學號 和平均成績
SELECT Sno, Gavg
FROM S_G
WHERE Gavg>85;
檢視消解查詢轉換
SELECT Sno, AVG(Grade)
FROM sc
GROUP BY Sno
HAVING AVG(Grade)>85;
更新檢視
將資訊系學生檢視 IS_Student 中學號 200215122 的 學生姓名改為“劉辰”
UPDATE IS_Student
SET Sname='劉辰'
WHERE Sno='200215122';
檢視消解轉換
UPDATE Student
SET Sname='劉辰'
WHERE Sdept='IS' AND Sno='200215122';
向資訊系學生檢視 IS_S 中插入一個新的學生記錄 : 200215129 ,趙新, 20 歲
INSERT INTO
IS_Student(Sno, Sname, Sage)
VALUES('200215129', '趙新', 20);
轉換為對基本表的更新
INSERT INTO
Student(Sno, Sname, Sage, Sdept)
VALUES('200215129', '趙新', 20, 'IS');
刪除資訊系學生檢視 IS_Student 中學號為 200215129 的記錄
DELETE FROM IS_Student
WHERE Sno='200215129';
轉換為對基本表的更新
DELETE
FROM student
WHERE Sno='200215129' AND Sdept='IS';
更新檢視的限制:一些檢視是不可更新的,因為對這些視 圖的更新不能唯一地有意義地轉換成對相應基本表的更新
檢視的作用
-
能夠簡化使用者操作
-
檢視使使用者能以多種角度看待同一資料
-
檢視對重構資料庫提供了一定程度的邏輯獨立性
-
檢視能夠對機密資料提供安全保護
-
適當的利用檢視可以更清晰的表達查詢