視圖的概念
- 視圖是一種虛擬的表公黑,具有和物理表相同的功能邑商。
- 視圖通常是有一個表或者多個表的行或列的子集凡蚜。
- 可以對視圖進行增,改朝蜘,查,操作
- 對視圖的修改不影響基本表
- 相比多表查詢谱醇,它使得獲取數(shù)據(jù)更容易
視圖的優(yōu)點
- 視圖能夠簡化用戶的操作暇仲,用戶完全不需要關(guān)心后面對應(yīng)的表的結(jié)構(gòu)、關(guān)聯(lián)條件和篩選條件
- 視圖使用戶能以多種角度看待同一數(shù)據(jù)
- 視圖為數(shù)據(jù)庫提供了一定程度的邏輯獨立性
- 視圖能夠?qū)C密數(shù)據(jù)提供安全保護奈附,用戶只能訪問被允許查詢的結(jié)果集
- 視圖的結(jié)構(gòu)確定后,可以屏蔽表結(jié)構(gòu)變化對用戶的影響桅狠,源表增加列對視圖沒有影響
視圖的操作
視圖的創(chuàng)建
基本格式:
CREATE [OR REPLACE]
[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
[DEFINER = { user | CURRENT_USER }]
[SQL SECURITY { DEFINER | INVOKER }]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
釋義:
OR REPLACE:表示替換已有視圖
ALGORITHM選項:選擇在處理定義視圖的select語句中使用的方法
- UNDEFINED:MySQL將自動選擇所要使用的算法
- MERGE:將視圖的語句與視圖定義合并起來,使得視圖定義的某一部分取代語句的對應(yīng)部分
- TEMPTABLE:將視圖的結(jié)果存入臨時表轿秧,然后使用臨時表執(zhí)行語句
- 缺省ALGORITHM選項等同于ALGORITHM = UNDEFINED
- DEFINER選項:指出誰是視圖的創(chuàng)建者或定義者
- definer= '用戶名'@'登錄主機'
- 如果不指定該選項,則創(chuàng)建視圖的用戶就是定義者菇篡,指定關(guān)鍵字CURRENT_USER(當(dāng)前用戶)和不指定該選項效果相同
- SQL SECURITY選項:要查詢一個視圖,首先必須要具有對視圖的select權(quán)限驱还。
- SQL SECURITY DEFINER:定義(創(chuàng)建)視圖的用戶必須對視圖所訪問的表具有select權(quán)限,也就是說將來其他用戶訪問表的時候以定義者的身份议蟆,此時其他用戶并沒有訪問權(quán)限。
- SQL SECURITY INVOKER:訪問視圖的用戶必須對視圖所訪問的表具有select權(quán)限咐容。
- 缺省SQL SECURITY選項等同于SQL SECURITY DEFINER
select_statement:表示select語句
[WITH [CASCADED | LOCAL] CHECK OPTION]:對視圖所做的DML操作的結(jié)果,不能違反視圖的WHERE條件的限制,保證更新視圖是在該視圖的權(quán)限范圍之內(nèi)戳粒。
cascade是默認(rèn)值,表示更新視圖的時候蔚约,要滿足檢查所有的視圖和表的相關(guān)條件
local表示更新視圖的時候奄妨,只檢查將要更新的視圖本身,對嵌套視圖(定義在另一個視圖的上面的視圖)不檢查其底層的視圖
建議:推薦使用 WHIT [CASCADED|LOCAL] CHECK OPTION選項苹祟,可以保證數(shù)據(jù)的安全性
查看視圖
- 使用
SHOW CREATE VIEW view_name;
查看視圖定義 - 像一個普通表那樣使用 SELECT 查詢視圖內(nèi)容
- 有關(guān)視圖的信息記錄在information_schema數(shù)據(jù)庫中的views表中
select * from information_schema.views where TABLE_NAME=view_name;
視圖的更改
- CREATE OR REPLACE VIEW語句修改視圖定義
- ALTER語句修改視圖
ALTER
[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
[DEFINER = { user | CURRENT_USER }]
[SQL SECURITY { DEFINER | INVOKER }]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
- 更新視圖中數(shù)據(jù) (DML操作)
因為視圖本身沒有數(shù)據(jù),對視圖進行的數(shù)據(jù)操作最終都體現(xiàn)在基表(用來創(chuàng)建視圖的表叫做基表)中苔咪,但是,并不是所有的視圖都可以做DML操作团赏。
下面情形中不能做DML操作:
- select子句中包含distinct
- select子句中包含組函數(shù)
- select語句中包含group by子句
- select語句中包含order by子句
- select語句中包含union 、union all等集合運算符
- where子句中包含相關(guān)子查詢
- from子句中包含多個表
- 如果視圖中有計算列舔清,則不能更新
- 如果基表中有某個具有非空約束的列未出現(xiàn)在視圖定義中曲初,則不能做insert操作
刪除視圖
刪除視圖時,只能刪除視圖的定義杯聚,不會刪除數(shù)據(jù),也就是說不動基表幌绍。
使用drop 刪除視圖,語法和刪除表類型:
DROP VIEW [IF EXISTS]
view_name [, view_name] ...
<END>