第8章 視圖
視圖是從一個或多個表中導出來的表,是一種虛拟存在的表。
視圖就像一個視窗,通過這個視窗可以看到系統專門提供的資料。
使用者可以不用看到整個資料庫表中的資料,而隻關心對自己有用的資料。
視圖可以使使用者的操作更友善,而且可以保障資料庫系統的安全性。
8.1 視圖簡介
視圖的作用是友善使用者對資料的操作。
8.1.1 視圖的含義
視圖是從一個或多個表中導出來的表,是一種虛拟存在的表。
視圖還可以從已經存在的視圖的基礎上定義。
資料庫中隻存放了視圖的定義,而并沒有存放視圖中的資料。這些資料存放在原來的表中。
是以,視圖中的資料是依賴于原來的表中的資料的。
一旦表中的資料發生改變,顯示在視圖中的資料也會發生改變。
MySQL的視圖不支援輸入參數的功能,是以互動性上還有欠缺。但對于不是很大的操作,使用視圖可以很大程度上簡化使用者的操作。
8.1.2 視圖的作用
1.使操作簡單化
視圖需要達到的目的就是所見即所需。
視圖可以簡化對資料的操作。
2.增加資料的安全性
通過視圖,使用者隻能查詢和修改指定的資料。
資料庫授權指令可以限制使用者的操作權限,但不能限制到特定行和列上。
使用視圖,可以簡單友善地将使用者的權限限制到特定的行和列上。這樣可以保證一些機密資訊的安全。
3.提高表的邏輯獨立性
8.2 建立視圖
8.2.1 建立視圖的文法形式
文法形式:
CREATE [ ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE} ]
VIEW 視圖名 [( 屬性清單 )]
AS SELECT 語句
[ WITH [ CASCADED | LOCAL ] CHECK OPTION ];
建立視圖時,需要有CREATE VIEW的權限。同時,應該具有查詢涉及的列的SELECT權限。
在MySQL資料庫下面的user表中儲存這些權限資訊,可以使用SELECT語句查詢。
SELECT語句查詢的方式如下:
SELECT Select_priv,Create_view_priv FROM mysql.user WHERE user='使用者名'
詳細說明見書上。
8.2.2 在單表上建立視圖
建立視圖的代碼eg:
CREATE VIEW department_view1
AS SELECT * FROM department;
8.2.3 在多表上建立視圖
MySQL中也可以在兩個或兩個以上的表上建立視圖,也是使用CREATE VIEW語句實作的。
例如:CREATE ALGORITHM=MERGE VIEW
worker_view1 (name, department, sex, age, address)
AS SELECT name, department.d_name, sex, 2009-birthday, address
FROM worker, departmment, WHERE worker.d_id=department.d_id
WITH LOCAL CHECK OPTION
8.3 檢視視圖
檢視視圖是指檢視資料庫中已存在的視圖的定義。
檢視視圖必須要有SHOW VIEW的權限,MySQL資料庫下的user表中儲存着這個資訊。
檢視視圖的方法:
DESCRIBE
SHOW TABLE STATUS
SHOW CREATE VIEW
查詢information_schema資料庫下的views表等。
8.3.1 DESCRIBE語句檢視視圖基本資訊
基本形式:
DESCRIBE 視圖名;
eg:
DESCRIBE worker_view1;
8.3.2 SHOW TABLE STATUS語句檢視視圖基本資訊
文法:
SHOW TABLE STATUS LIKE '視圖名';
eg:
SHOW TABLE STATUS LIKE 'worker_view1';
8.3.3 SHOW CREATE VIEW語句檢視視圖詳細資訊
文法:
SHOW CREATE VIEW 視圖名;
eg:
SHOW CREATE VIEW worker_view1;
8.3.4 在views表中檢視視圖詳細資訊
SELECT * FROM information_schema.views;
8.4 修改視圖
修改視圖是指修改資料庫中已存在的表的定義。
當基本表的某些字段發生改變時,可以通過修改視圖來保持視圖和基本表之間一緻。
MySQL中通過CREATE OR REPLACE VIEW語句和ALTER語句來修改視圖。
8.4.1 CREATE OR REPLACE VIEW語句修改視圖
CREATE OR REPLACE VIEW的使用非常靈活:
在視圖已經存在的情況下,對視圖進行修改;
視圖不存在時,可以建立視圖。
文法:
CREATE OR REPLACE [ ALGORITHM={ UNDEFINED | MERGE | TEMPTABLE} ]
VIEW 視圖名 [( 屬性清單 )]
AS SELECT 語句
[ WITH [CASCADED | LOCAL ] CHECK OPTION];
CREATE OR REPLACE ALGORITHM=TEMPLATE
VIEW department_view1 (department, function, location )
AS SELECT d_name, function, address FROM department;
8.4.2 ALTER語句修改視圖
在MySQL中,ALTER語句的作用:
修改表的定義;
建立索引;
修改視圖。
文法:
ALTER [ ALGORITHM={UNDEFINED | MERGE | TEMPTABLE} ]
VIEW 視圖名 [( 屬性清單 )]
AS SELECT 語句
[ WITH [ CASCADED | LOCAL ] CHECK OPTION ];
8.5 更新視圖
更新視圖是指通過視圖來插入(INSERT)、更新(UPDATE)、删除(DELETE)表中的資料。
因為視圖是一個虛拟表,是以其中沒有資料。
通過視圖更新時,都是轉換到基本表來更新。
更新視圖時,隻能更新權限範圍内的資料,超出了範圍,就不能更新。
注意:
視圖中雖然可以更新資料,但是有很多限制。
一般情況下,最好将視圖作為查詢資料的虛拟表,而不要通過視圖更新資料。
因為,使用視圖更新資料時,如果沒有全面考慮在視圖中更新資料的限制,可能會造成資料更新失敗。
8.6 删除視圖
删除視圖時,隻能删除視圖的定義,不會删除資料。
MySQL中,使用DROP VIEW來删除視圖。但是使用者必須擁有DROP權限。
文法:
DROP VIEW [IF EXISTS] 視圖名清單 [RESTRICT | CASCADE]
其中,IF EXISTS參數指判斷視圖存在,如果存在則執行,不存在則不執行;“視圖名清單”參數表示要删除的視圖的名稱的清單。
8.8 常見問題及解答
1.MySQL中視圖和表的差別及聯系是什麼?
差別:
(1)視圖是按照SQL語句生成的一個虛拟的表;
(2)視圖不占實際的實體空間,而表中的記錄需要占實體空間;
(3)建立和删除視圖隻影響視圖本身,不會影響實際的記錄。而建立和删除表會影響實際的記錄。
聯系:
(1)視圖是建立在表之上的表,其字段和記錄都來自基本表,其依賴基本表而存在;
(2)一個視圖可以對應一個基本表,也可以對應多個基本表;
(3)視圖是基本表的抽象,在邏輯意義上建立的新關系。
2.為什麼視圖更新不了?
可能的原因:
視圖中包含SUM()、COUNT()、MAX()、MIN()等函數;
視圖中包含UNION、UNION ALL、DISTINCT、GROUP BY、HAVING等關鍵字;
視圖是一個常量視圖,而且該列沒有包含在視圖中等。
參考文獻:
1.《MySQL入門很簡單》。