從用戶角度來看,一個視圖是從一個特定的角度來查看數據庫中的數據。從數據庫系統內部來看,一個視圖是由SELECT語句組成的查詢定義的虛擬表。從數據庫系統內部來看,視圖是由一張或多張表中的數據組成的,從數據庫系統外部來看,視圖就如同一張表一樣,對錶能夠進行的一般操作都可以應用於視圖,例如查詢,插入,修改,刪除操作等。視圖是一個虛擬表,其內容由查詢定義。
概述:
ü 視圖以經過定製的方式顯示來自一個或多個表的數據
ü 視圖是一種數據庫對象,用戶可以象查詢普通表一樣查詢視圖。
ü 視圖內其實沒有存儲任何數據,它只是對錶的一個查詢。
ü 視圖的定義保存在數據字典內。創建視圖所基於的表爲“基表”。
ü 視圖一經定義以後,就可以像表一樣被查詢、修改、刪除和更新
作用:精華志京華志畢業設計輔導諮詢 [email protected]
ü 簡化數據查詢語句
ü 使用戶能從多角度看到同一數據
ü 提高了數據的安全性
ü 提供了一定程度的邏輯獨立性
ü 減少帶寬流量、優化後還可提高執行效率
優點:
ü 提供了另外一種級別的表安全性
ü 隱藏的數據的複雜性
ü 簡化的用戶的SQL命令
ü 通過重命名列,從另一個角度提供數據
視圖的創建:
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
說明:
l OR REPLACE:給定了OR REPLACE子句,語句能夠替換已有的同名視圖。
l ALGORITHM:可選的mysql算法擴展,算法會影響MySQL處理視圖的方式。有以下三個值:
UNDEFINED--MySQL將選擇所要使用的算法。如果可能,它傾向於MERGE而不是TEMPTABLE,這是因爲MERGE通常更有效,而且如果使用了臨時表,視圖是不可更新的。
MERGE--會將引用視圖的語句的文本與視圖定義合併起來,使得視圖定義的某一部分取代語句的對應部分。
TEMPTABLE--視圖的結果將被置於臨時表中,然後使用它執行語句。
l veiw_name:視圖名。
l column_list:要想爲視圖的列定義明確的名稱,列出由逗號隔開的列名。column_list中的名稱數目必須等於SELECT語句檢索的列數。若使用與源表或視圖中相同的列名時可以省略column_list。
l select_statement:用來創建視圖的SELECT語句,可在SELECT語句中查詢多個表或視圖。但對SELECT語句有以下的限制:
1.定義視圖的用戶必須對所參照的表或視圖有查詢(即可執行SELECT語句)權限;
2.在定義中引用的表或視圖必須存在;
l WITH [cascaded|local] CHECK OPTION:在關於可更新視圖的WITH CHECK OPTION子句中,當視圖是根據另一個視圖定義的時,LOCAL和CASCADED關鍵字決定了檢查測試的範圍。LOCAL關鍵字對CHECK OPTION進行了限制,使其僅作用在定義的視圖上,CASCADED會對將進行評估的基表進行檢查。如果未給定任一關鍵字,默認值爲CASCADED。WITH CHECK OPTION指出在可更新視圖上所進行的修改都要符合select_statement所指定的限制條件,這樣可以確保數據修改後,仍可通過視圖看到修改的數據。
l 視圖定義服從下述限制:
ü SELECT語句不能包含FROM子句中的子查詢。
ü SELECT語句不能引用系統或用戶變量。
ü SELECT語句不能引用預處理語句參數。
ü 在存儲子程序內,定義不能引用子程序參數或局部變量。
ü 在定義中引用的表或視圖必須存在。但是,創建了視圖後,能夠捨棄定義引用的表或視圖。要想檢查視圖定義是否存在這類問題,可使用CHECK TABLE語句。
ü 在定義中不能引用TEMPORARY表,不能創建TEMPORARY視圖。
ü 在視圖定義中命名的表必須已存在。
ü 不能將觸發程序與視圖關聯在一起。
修改視圖:
ALTER [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
說明:
該語句用於更改已有視圖的定義。其語法與CREATE VIEW類似。該語句需要具有針對視圖的CREATE VIEW和DROP權限,也需要針對SELECT語句中引用的每一列的某些權限。
查看視圖:精華志京華志畢業設計輔導諮詢 [email protected]
SHOW CREATE VIEW view_name
說明:
該語句給出了1個創建給定視圖的CREATE VIEW語句。
刪除視圖:
DROP VIEW [IF EXISTS]
view_name [, view_name] ...
[RESTRICT | CASCADE]
說明:
l DROP VIEW能夠刪除1個或多個視圖。必須在每個視圖上擁有DROP權限。
l 可以使用關鍵字IF EXISTS來防止因不存在的視圖而出錯。
l 如果給定了RESTRICT和CASCADE,將解析並忽略它們。
更新視圖:
概述:
視圖的使用與表一樣,有增刪改查四種操作,且語法也與表相同。
在視圖上也可以使用修改數據的DML語句,如INSERT、UPDATE和DELETE可以統稱爲“通過視圖更新數據”。
通過視圖更新數據有如下限制:
ü 一次只能修改一個底層的基表
ü 如果修改違反了基表的約束條件,則無法更新視圖
ü 如果視圖中的列不是表中的原始列(如創建視圖時使用了連接操作符、聚合函數等),則不能通過視圖更新。
視圖更新操作:
可更新的視圖:要通過視圖更新基本表數據,必須保證視圖是可更新視圖,即可以在INSET、UPDATE或DELETE等語句當中使用它們。對於可更新的視圖,在視圖中的行和基表中的行之間必須具有一對一的關係。還有一些特定的其他結構,這類結構會使得視圖不可更新。如果視圖包含下述結構中的任何一種,那麼它就是不可更新的:
ü 聚合函數;
ü DISTINCT關鍵字;
ü GROUP BY子句;
ü ORDER BY子句;
ü HAVING子句;
ü UNION運算符;
ü 位於選擇列表中的子查詢;
ü FROM子句中包含多個表;
ü SELECT語句中引用了不可更新視圖;
插入數據:使用INSERT語句通過視圖向基本表插入數據
注意:
ü 當視圖所依賴的基本表有多個時,不能向該視圖插入數據,因爲這將會影響多個基本表。
ü 對INSERT語句還有一個限制:SELECT語句中必須包含FROM子句中指定表的所有不能爲空的列。
修改數據:使用UPDATE語句可以通過視圖修改基本表的數據
注意:若一個視圖依賴於多個基本表,則一次修改該視圖只能變動一個基本表的數據。
刪除數據:使用DELETE語句可以通過視圖刪除基本表的數據
注意:對依賴於多個基本表的視圖,不能使用DELETE語句。