數據庫8——能簡化操作的視圖

視圖

什麼是視圖呢?
首先,視圖是一個虛表,所謂虛表,是從一個或幾個基本表(或者視圖)導出的表,它只存放視圖的定義,而不存放視圖對應的數據。當基表中的數據發生變化,從視圖中查出的數據也隨之改變。
也就是說,視圖本質上是一個查詢語句。數據庫保存的不是查詢的結果,而是查詢本省。
基於視圖的操作有四種:查詢、刪除、受限更新、定義基於視圖的新視圖。

視圖的作用

  • 視圖能簡化用戶的操作;
  • 視圖使用戶能以多種角度看待同一數據;
  • 視圖對重構數據庫提供了一種程度的邏輯獨立性
  • 視圖能夠對機密數據提供安全保護;
  • 適當的利用視圖可以更清晰的表達查詢。

定義視圖

語法格式爲:

create view 視圖名(列名,……)
as 子查詢
with check option;

列名可以省略,表示全部選擇。但是,有三種情況不能省略:

  • 子查詢的某個目標列不是單純的屬性名,是集函數或表達式。
  • 多表連接是選出了幾個同名列作爲視圖的字段
  • 需要在視圖中爲某個列啓用新的更合適的名字。

with check option表示對視圖進行update、insert、delete時要保證更新、插入或刪除的行滿足視圖定義中的謂詞條件(即子查詢中的條件表達式)

注意:

  • 子查詢不允許含有order by 子句和distinct短語。
  • RDBMS執行 create view語句時只是把視圖定義存入數據字典,並不執行其中的select語句。
  • 在對視圖查詢時,按視圖的定義從基本表中將數據查出。
/* 信息系學生視圖 */
create view IS_Student1 as 
select Sno,Sname,Sage,Sdept from Student where Sdept = 'IS'
with check option;

/* 基於多個表的視圖 */
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;

刪除視圖

語法格式:

drop view 視圖名;
drop view 視圖名 cascade;/* 如果該視圖導出了其他視圖,會一併刪除 */

查詢視圖

查詢視圖和查詢基本表的操作相同

但是DBMS執行的過程不同(視圖消解),DBMS會首先進行有效性檢查,檢查查詢的表、視圖等是否存在,然後轉換成等價的對基本表的查詢,最後執行修正後的查詢。

視圖更新

視圖更新操作包括插入(insert)、修改(update)和刪除(delete)數據。語法格式和基本表的更新操作一樣。

由於視圖是一張虛表,所以對視圖的更新,最終實際上是轉換成基本表的更新,所以並不是所有的視圖都是可以更新的。以下視圖不能進行更新:

  • 從多個基本表通過連接操作導出的視圖,不允許更新;
  • 對使用了分組、集函數操作的視圖,不允許 進行更新操作;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章