1. 程式人生 > 其它 >sql檢視

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';

更新檢視的限制:一些檢視是不可更新的,因為對這些視 圖的更新不能唯一地有意義地轉換成對相應基本表的更新

檢視的作用

  1. 能夠簡化使用者操作

  2. 檢視使使用者能以多種角度看待同一資料

  3. 檢視對重構資料庫提供了一定程度的邏輯獨立性

  4. 檢視能夠對機密資料提供安全保護

  5. 適當的利用檢視可以更清晰的表達查詢