視圖是從一個或多個表中導出來的虛擬表。視圖就像一個窗口,通過這個窗口可以看到系統專門提供的數據。
視圖是從一個或多個表中導出來的虛擬表,還可以從已經存在的視圖的基礎上定義。
數據庫中只存放視圖的定義,而不存放視圖中的數據,這些數據仍存放在原來的表中。一旦表中的數據發生變化,顯示在視圖中的數據也會相應變化。
MySQL的視圖並不支持輸入參數的功能,即交互性上較差,但對於變化不是很大的操作,使用視圖可以很大程度上簡化用戶的操作。
視圖起著類似於篩選的作用,具體可歸納為
(1)所見即所需,使操作簡單化
(2)通過視圖,用戶只能查詢和修改指定的數據,從而限制了用戶的權限,增加了數據的安全性
(3)視圖可以屏蔽原有表結構變化帶來的影響,從而提高了表的邏輯獨立性。
MySQL中,創建視圖是通過Creat View語句實現的,具體為
其中,Algorithm為視圖選擇的算法;屬性清單指定了視圖中各個屬性的名詞,默認情況下與Select語句中查詢的屬性相同;Select語句是一個完整的查詢語句,表示從某個表中查出某些滿足條件的記錄並將這些記錄導入到視圖中;With Check Option表示更新視圖時要保證在該視圖的權限范圍之內,CASCADED表示更新視圖時要滿足所有相關視圖和表的條件,為默認值,Local表示更新視圖時要滿足該視圖本身的定義即可;注意在使用創建視圖時最好加上With Check Option,並選取默認的CASCADED參數。從而保證從視圖派生出來的新視圖在更新後可以考慮其父視圖的約束條件,即更嚴謹。
(1)關於Algorithm中的三個選項,Undefined選項表示MySQL將自動選擇所要使用的算法,Merge選項表示將使用視圖的語句與視圖定義合並起來,使得視圖定義的某一部分代替語句的對應部分,Temptable選項表示將視圖的結果存入臨時表,然後使用臨時表執行語句。
(2)需要注意的是,在創建視圖之前,需要檢查是否具有Create view的權限和查詢涉及的列的Select權限,這些權限保存在MySQL數據庫下面的user表中,可以適用select語句查詢,具體為
select select_priv, create_view_priv from mysql.user where user=’用戶名’
其中,用戶名參數表示要查詢哪個用戶是否擁有Drop權限,在我的系統中,只有root用戶。
下面是一個從department表和worker表上創建一個名為worker_view1的視圖的案例
查看視圖必須要有show view的權限,同樣保存在user表中。
查看視圖的方法包括describe語句、show table status語句、show create view語句和查詢information_schema數據庫下的views表等。
查看視圖的describe語句和查看表的語句是一樣的,因為視圖是一種特殊的表,基本形式為
describe 視圖名;
基本形式為
Show Table Status Like ‘視圖名’;
基本形式為
Show create view 視圖名;
MySQL中,所有視圖的定義都存在information_schema數據庫下的views表中,查詢此表即可查看到數據庫中所有視圖的詳細信息。
基本形式為
select * from information_schema.views;
其中*表示查詢所有的列的信息。
顯然用此語句查看到的是所有的視圖,不方便查閱,一般查詢詳細信息時用3.3法即可。
當基本表的某些字段發生改變時,有必要修改視圖的定義來保持視圖和基本表之間的一致性。
此語句很好用,在存在視圖情況下可對視圖進行修改,在沒有視圖情況下,可以創建視圖,具體語法為
實際上,感覺此語句就是重新定義了個視圖並覆蓋了原始圖。<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxoMyBpZD0="42-alter語句">4.2 Alter語句
回顧前面,alter語句不僅可以創建索引,修改表的定義,在此處,還可以修改視圖的定義。
基本形式為
更新視圖是指通過視圖來插入、更新和刪除表中的數據。
更新視圖時,只能更新權限范圍內的數據。
實際上對視圖的更新最後都是實現在基本表上的。
注意以下情況不能更新視圖:
(1)視圖中包含sum(),count(),max()和min()等函數
(2)視圖中包含union,union all,distinct,group by和having等關鍵字
(3)常量視圖,即視圖中的某個字段時常量類型
(4)視圖中的select中包含子查詢
(5)由不可更新的視圖導出的視圖
(6)創建視圖時,algorithm選擇了temptable類型,即系統默認臨時表是不可更新的
(7)視圖對應的表上存在沒有默認值的列,且該列沒有包含在視圖中。因為,在更新視圖時,這個沒有默認值的記錄將沒有值插入,也沒有NULL值插入,系統不允許這種情況出現
由於視圖的更新存在很多限制,一般,最好把視圖作為查詢數據的虛擬表,而不要通過視圖來更新數據,很容易造成更新失敗。
刪除視圖只會刪除視圖的定義,並不會刪除數據。DROP View語句可用來刪除視圖,但用戶必須擁有drop的權限,具體操作為
drop view [if exists] 視圖名列表 [restrict|cascade]
其中,if exists用來判斷視圖存在,存在才執行;在視圖名列表中不同視圖名稱之間通過逗號隔開。