視圖是一種虛擬存在的表,對於使用視圖的用戶來說基本上是透明的。視圖並不在數據庫中實際存在,行和列數據來自定義視圖的查詢總使用的表,並且是在使用視圖時動態生成的。
視圖相對於普通表的優勢:
簡單:使用視圖的用戶完全不需要關系后面對應的表結構、關聯條件和篩選條件,對用戶來說已經是過濾好的符合條件的結果集。
安全:使用視圖的用戶只能訪問他們被允許的結果集,對表的權限管理並不能限制到某個行某個列,但是通過視圖就可以簡單的實現。
數據獨立:一旦視圖的結構確定了,可以屏蔽表結構變化對用戶的影響,源表增加列對視圖沒有影響;源表修改列名,則可以通過修改視圖來解決,不會造成對訪問者的影響。
創建視圖
CREATE [OR REPLACE] VIEW 視圖名(列1,列2...)
AS SELECT (列1,列2...)
FROM ...;
[WITH [CASCADED|LOCAL] CHECK OPTION]
修改視圖
CREATE OR REPLACE VIEW 視圖名 AS SELECT [...] FROM [...];
[WITH [CASCADED|LOCAL] CHECK OPTION]
查看視圖
show tables;
desc 視圖名
查看視圖定義
show create view 視圖名稱\G
通過視圖變更數據
insert into 視圖名
update 視圖名
[WITH [CASCADED|LOCAL] CHECK OPTION] 決定了是否允許更新數據記錄不再滿足視圖的條件。
local只要滿足本視圖的條件就可以更新
cascaded則必須滿足所有針對該視圖的所有視圖的條件才可以更新,默認是cascaded。
為了防止通過視圖修改導致數據無故丟失,建議加上WITH CHECK OPTION
視圖的可更新性和視圖中查詢的定義有關系,一下類型的視圖是不可更新的。
1.包含一下關鍵字的sql語句:聚合函數(sum,min,max,count等),distinct,group by,having,union或者union all.
2.常亮視圖。
3.select中包含子查詢。
4.jion
5.from一個不能更新的視圖
6.where句子的子查詢引用了from句子中的表
刪除視圖
drop view 視圖名稱
備注:
1.可以通過視圖插入數據,但是只能基於一個基礎表進行插入,不能跨表更新數據
2.視圖不是表,不保存數據,只是一張虛擬的表,源表的數據發生變化后,視圖的結果也同步發生變化
3. 一般情況下,在創建有條件限制的視圖時,加上“WITH CHECK OPTION”命令。
