MySQL View(檢視)詳解

神諭丶發表於2015-08-27

從使用者角度來看,一個檢視是從一個特定的角度來檢視資料庫中的資料。從資料庫系統內部來看,一個檢視是由 SELECT 語句組成的查詢定義的虛擬表。
從資料庫系統內部來看,檢視是由一張或多張表中的資料組成的,從資料庫系統外部來看,檢視就如同一張表一樣,對錶能夠進行的一般操作都可以應用於檢視,例如查詢,插入,修改,刪除操作等。
檢視是一個虛擬表,其內容由查詢定義。

概述:

□ 檢視以經過定製的方式顯示來自一個或多個表的資料


□ 檢視是一種資料庫物件,使用者可以象查詢普通表一樣查詢檢視。 

□ 檢視內其實沒有儲存任何資料,它只是對錶的一個查詢。


□ 檢視的定義儲存在資料字典內。建立檢視所基於的表為基表。 

□ 檢視一經定義以後,就可以像表一樣被查詢、修改、刪除和更新。


作用:

□ 簡化資料查詢語句


□ 使使用者能從多角度看到同一資料


□ 提高了資料的安全性

□ 提供了一定程度的邏輯獨立性

□ 減少頻寬流量、最佳化後還可提高執行效率

優點:

□ 提供了另外一種級別的表安全性

□ 隱藏的資料的複雜性

□ 簡化的使用者的 SQL 命令

□ 透過重新命名列,從另一個角度提供資料

檢視的建立:

CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] VIEW view_name [(column_list)]

AS select_statement

[WITH [CASCADED | LOCAL] CHECK OPTION]

說明:

□ OR REPLACE:給定了 OR REPLACE 子句,語句能夠替換已有的同名檢視。
□ ALGORITHM:可選的mysql演算法擴充套件,演算法會影響MySQL處理檢視的方

式。有以下三個值:

UNDEFINED--MySQL 將選擇所要使用的演算法。如果可能,它傾向於

MERGE 而不是 TEMPTABLE,這是因為 MERGE 通常更有效,而且如果使用了臨時 表,檢視是不可更新的。

MERGE--會將引用檢視的語句的文字與檢視定義合併起來,使得檢視定義 的某一部分取代語句的對應部分。

TEMPT ABLE--檢視的結果將被置於臨時表中,然後使用它執行語句。

□ veiw_name:檢視名。

□ column_list:要想為檢視的列定義明確的名稱,列出由逗號隔開的列名。

column_list 中的名稱數目必須等於 SELECT 語句檢索的列數。若使用 與源表或檢視中相同的列名時可以省略 column_list

□ select_statement: 用來建立檢視的 SELECT 語句,可在 SELECT 語句 中查詢多個表或檢視。但對 SELECT 語句有以下的限制:

1. 定義檢視的使用者必須對所參照的表或檢視有查詢(即可執行 SELECT 語句)許可權;

2. 在定義中引用的表或檢視必須存在;

□ WITH [cascaded|local] CHECK OPTION: 在關於可更新檢視的 WITH CHECK OPTION 子句中,當檢視是根據另一個檢視定義的時,LOCAL CASCADED 關鍵字決定了檢查測試的範圍。LOCAL 關鍵字對 CHECK OPTION 進行了限制,使其僅作用在定義的檢視上,CASCADED 會對將進行評估的基表 進行檢查。如果未給定任一關鍵字,預設值為 CASCADEDWITH CHECK OPTION 指出在可更新檢視上所進行的修改都要符合 select_statement 所指定的 限制條件,這樣可以確保資料修改後,仍可透過檢視看到修改的資料。

檢視定義服從下述限制:

□ 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 語句中引用的每一列的某些許可權。

檢視檢視:

SHOW CREATE VIEW view_name

說明:

該語句給出了 1 個建立給定檢視的 CREATE VIEW 語句。

刪除檢視:

DROP VIEW [IF EXISTS]

view_name [, view_name] ...

[RESTRICT | CASCADE]

說明:

□ DROP VIEW 能夠刪除 1 個或多個檢視。必須在每個檢視上擁有 DROP 許可權。
□ 可以使用關鍵字 IF EXISTS 來防止因不存在的檢視而出錯。

□ 如果給定了 RESTRICT CASCADE,將解析並忽略它們。

更新檢視:

概述:

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

在檢視上也可以使用修改資料的 DML 語句,如 INSERTUPDATE DELETE可以統稱為透過檢視更新資料。 

透過檢視更新資料有如下限制:

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

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

□ 如果檢視中的列不是表中的原始列(如建立檢視時使用了連線運算子、聚合函式等),則不能透過檢視更新。

檢視更新操作:

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

□ 聚合函式;

□ DISTINCT 關鍵字;

□ GROUP BY子句;

□ ORDER BY子句;

□ HAVING 子句;

□ UNION 運算子;

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

□ FROM 子句中包含多個表;

□ SELECT 語句中引用了不可更新檢視;


插入資料:
使用
INSERT 語句透過檢視向基本表插入資料

注意:

□ 當檢視所依賴的基本表有多個時,不能向該檢視插入資料,因為這將會 影響多個基本表。

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


修改資料:
使用
UPDATE 語句可以透過檢視修改基本表的資料
注意:若一個檢視依賴於多個基本表,則一次修改該檢視只能變動一個基本表的資料。


刪除資料:
使用
DELETE 語句可以透過檢視刪除基本表的資料
注意:對依賴於多個基本表的檢視,不能使用
DELETE 語句。



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29773961/viewspace-1784095/,如需轉載,請註明出處,否則將追究法律責任。

相關文章