天天看點

視圖

為什麼要使用視圖?

    當然是因為它有很多好處啦,那它有哪些好處呢:

  1.視圖能夠簡化使用者的操作

    視圖機制使使用者可以将注意力集中在所關心的資料上(換句話說就是可以不用去什麼那些我們不 care 的資料)。

    也即,如果你所關心的資料不是直接來自基本表(比如說來自多張表或者有一些經過計算、處理的資料),那麼定義視圖可以使資料庫看起來結構簡單、清晰,并且可以簡化使用者的資料查詢操作。

    例如,那些定義了若幹張表連接配接的視圖就将表與表之間的連接配接操作對使用者隐藏起來了。

    換句話說,使用者所做的隻是對一個虛表的簡單查詢就可以檢視到我們所需要的來自多張表的資料(而這個虛表是怎麼得來的,使用者無須了解)。

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

    視圖機制能使不同的使用者以不同的方式看待同一資料(不同的使用者在多個相同的基本表之上建立不同的視圖,組成不同的含義),當許多不同種類的使用者共享同一個資料庫時,這種靈活性是非常重要的。

  3.視圖對重構資料庫提供了一定程度的邏輯獨立性(資料的邏輯獨立性是指當資料庫重構時,如增加新的關系或對原有關系增加新的字段等,使用者的應用程式不會受影響)

    在關系資料庫中,資料庫的重構往往是不可避免的。

    重構資料庫最常見的是将一個基本表“垂直”地分成多個基本表。這樣,通過建立視圖,盡管資料庫的邏輯結構改變了,但應用程式不必修改。

    當然,視圖隻能在一定程度上提供資料的邏輯獨立性,由于對視圖的更新是有條件的,是以應用程式中修改資料的語句可能仍會因基本表結構的改變而需要做相應修改。

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

    有了視圖機制,就可以在設計資料庫應用系統時對不同的使用者定義不同的視圖,使機密資料不出現在不應看到這些資料的使用者視圖上。(這樣視圖機制就自動提供了對機密資料的安全保護功能)

    例如,Student 表涉及全校15個院系的學生資料,可以在其上定義15個視圖,每個視圖隻包含一個院系的學生資料,并隻允許每個院系的主任查詢和修改本院系的學生視圖。

  5.适當利用視圖可以更清晰地表達查詢(可以将常用的一些複雜的查詢的一部分拿出來建立一個視圖,然後再通過視圖完成剩下的一部分)

什麼是視圖?

    視圖是從一個或幾個表(或視圖)導出的表。它與基本表不同,是一個虛表。

    資料庫中隻存放視圖的定義,而不存放視圖對應的資料,這些資料仍存放在原來的基本表中。

    是以,一旦基本表中的資料發生變化,從視圖中查詢出的資料也就随之改變了。(從這個意義上講,視圖就像一個視窗,透過它可以看到資料庫中自己感興趣的資料及其變化。)

    視圖一經定義,就可以和基本表一樣被查詢、被删除。(也可以在一個視圖上再定義新的視圖,但對視圖的更新(增、删、改)操作則有一定的限制)

定義視圖(建立視圖):

    SQL 語句用 create view 指令建立視圖,其一般格式為

       create view <視圖名> [(<列名> [,<列名>]…)]

       AS <子查詢>        -- 子查詢可以是任意的 select 語句 (是否可以含有 order by 子句和 distinct 短語,則取決于具體系統的實作)

       [with check option] ;       -- with check option 表示對視圖進行 update、insert 和 delete 操作時要保證更新、插入或删除的行滿足視圖定義中“子查詢中的條件表達式”

    組成視圖的屬性列名,或者全部省略,或者全部指定(緊跟着視圖名),沒有第三種選擇。但在下列三種情況下必須明确指定組成視圖的所有列名:

    (1)某個目标列不是單純的屬性名,而是聚合函數或清單達式;

    (2)多表連接配接時選出了幾個同名列作為視圖的字段;

    (3)需要在視圖中為某個列啟用新的更合适的名字。

    若一個視圖是從單個基本表導出的,并且隻是去掉了基本表的某些行和某些列,但保留了主碼,則稱這類視圖為行列子集視圖。

    定義基本表時,為了減少資料庫中的備援資料,表中隻存放基本資料,由基本資料經過各種計算派生出的資料一般是不存儲的。

    由于視圖中的資料并不實際存儲,是以定義視圖時可以根據應用的需要設定一些派生屬性列。這些派生屬性由于在基本表中并不實際存在,也稱它們為虛拟列。

    (帶虛拟列的視圖也稱為帶表達式的視圖)

删除視圖:

    drop view<視圖名> [cascade] ;

    如果視圖上還導出了其他視圖,則可以使用 cascade 級聯删除語句把該視圖和由它導出的所有視圖一起删除(不使用 cascade 則拒絕執行)。

    基本表删除後,由該基本表導出的所有視圖均無法使用了,但是視圖的定義沒有從字典中清除。(删除這些視圖定義需要顯式地使用 drop view 語句)

查詢視圖:

    視圖定義後,使用者就可以像對基本表一樣對視圖進行查詢了。

    關系資料庫管理系統執行對視圖的查詢時,首先進行有效性檢查,檢查查詢中涉及的表、視圖等是否存在。如果存在,則從資料字典中取出視圖的定義,把定義中的子查詢和使用者調用視圖的查詢結合起來,轉換成等價的對基本表的查詢。

    一般情況下,視圖查詢的轉換是直截了當的。但有些情況下,這種轉換不能直接進行,查詢時就會出現問題。

    where 子句中是不能用聚集函數作為條件表達式的,是以含有聚集函數的視圖在查詢的時候就有可能會遇到問題(當含有聚集函數的字段又出現在 where子句中時)。

    目前多數關系資料庫系統對行列子集視圖的查詢均能進行正确轉換。但對非行列子集視圖的查詢就不一定能做轉換了。

更新視圖:

    更新視圖是指通過視圖來插入(insert)、删除(delete)和修改(update)資料。

    由于視圖是不實際存儲資料的虛表,是以對視圖的更新最終要轉換為對基本表的更新。