MYSQL數據庫的視圖(view)

(2)視圖(view

用戶角度來看,一個視圖是從一個特定的角度來查看數據庫中的數據。從數據庫系統內部來看,一個視圖是由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子句中,當視圖是根據另一個視圖定義的時,LOCALCASCADED關鍵字決定了檢查測試的範圍。LOCAL關鍵字對CHECK OPTION進行了限制,使其僅作用在定義的視圖上,CASCADED會對將進行評估的基表進行檢查。如果未給定任一關鍵字,默認值爲CASCADEDWITH 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 VIEWDROP權限,也需要針對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  如果給定了RESTRICTCASCADE,將解析並忽略它們。

更新視圖:

概述:

  視圖的使用與表一樣,有增刪改查四種操作,且語法也與表相同。

  在視圖上也可以使用修改數據的DML語句,如INSERTUPDATEDELETE可以統稱爲通過視圖更新數據

  通過視圖更新數據有如下限制:

ü  一次只能修改一個底層的基表

ü  如果修改違反了基表的約束條件,則無法更新視圖

ü  如果視圖中的列不是表中的原始列(如創建視圖時使用了連接操作符、聚合函數等),則不能通過視圖更新。

視圖更新操作:

  可更新的視圖:要通過視圖更新基本表數據,必須保證視圖是可更新視圖,即可以在INSETUPDATEDELETE等語句當中使用它們。對於可更新的視圖,在視圖中的行和基表中的行之間必須具有一對一的關係。還有一些特定的其他結構,這類結構會使得視圖不可更新。如果視圖包含下述結構中的任何一種,那麼它就是不可更新的:

ü  聚合函數;

ü  DISTINCT關鍵字;

ü  GROUP BY子句;

ü  ORDER BY子句;

ü  HAVING子句;

ü  UNION運算符;

ü  位於選擇列表中的子查詢;

ü  FROM子句中包含多個表;

ü  SELECT語句中引用了不可更新視圖;

  插入數據:使用INSERT語句通過視圖向基本表插入數據

spacer.gif

注意:

ü  當視圖所依賴的基本表有多個時,不能向該視圖插入數據,因爲這將會影響多個基本表。

ü  INSERT語句還有一個限制:SELECT語句中必須包含FROM子句中指定表的所有不能爲空的列。

  修改數據:使用UPDATE語句可以通過視圖修改基本表的數據

注意:若一個視圖依賴於多個基本表,則一次修改該視圖只能變動一個基本表的數據。

 

  刪除數據:使用DELETE語句可以通過視圖刪除基本表的數據

注意:對依賴於多個基本表的視圖,不能使用DELETE語句。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章