1. 視圖簡介
1.1 視圖定義
視圖是一種虛擬的表,是從數據庫中一個或多個表中導出來的表。
視圖可以從已存在的視圖的基礎上定義。
數據庫中只存放視圖的定義,並沒有存放視圖中的數據,數據存放在原來的表中。
視圖中的數據依賴於原來的表中的數據,表中的數據發生變化,顯示在視圖中的數據也會改變。
1.2 視圖作用
(1)增加數據安全性
通過視圖,用戶只能查詢和修改指定的數據。
數據庫授權命令可以限制用戶的操作權限,但不能限制到特定行和列上。使用視圖可以將用戶的權限限制到特定的行和列上。
(2)提高表的邏輯獨立性
視圖可以屏蔽原有表結構變化帶來的影響。
原有的表結構增加列和刪除未被引用的列,對視圖不造成影響。
2. 創建視圖
2.1 創建視圖語法
CREATE VIEW語法形式:
CERATE [ALGORITHM = { UNDEFINED | MERGE | TEMPTABLE }] VIEW view_name [(column_name, .. ,column_name)] AS SELECT statement [WITH [CASCADED | LOCAL] CHECK OPTION];
其中:
ALGORITHM:視圖選擇的算法,包括UNDEFINED,MERGE及TEMPTABLE。
UNDEFINED:MySQL將自動選擇所需要的算法;
MERGE:將使用視圖的語句與視圖定義合並起來,使得視圖定義的某一部分取代語句的對應部分;
TEMPTABLE:將視圖的結果存入臨時表,使用臨時表執行語句。
CASCADED:表示更新視圖時,要滿足所有相關視圖和表的條件,該參數為默認值。
LOCAL:表示更新視圖時,要滿足該視圖本身的定義的條件即可。
使用CREATE VIEW語句創建視圖時,最好加上WITH CASCADED CHECK OPTION參數。
創建視圖時,需要有CREATE VIEW權限。同時具有查詢涉及列的SELECT權限。
在mysql數據庫的user表中保存用戶權限,使用SELECT語句查詢:
mysql> SELECT Select_priv,Create_view_priv FROM mysql.user WHERE user='root';
+-------------+------------------+ | Select_priv | Create_view_priv | +-------------+------------------+ | Y | Y | +-------------+------------------+
2.2 創建視圖示例
mysql> CREATE VIEW vproduct -> AS -> SELECT ProductID,ProductName FROM product;
mysql> CREATE VIEW vproduct(ProductID,ProductName) -> AS -> SELECT ProductID,ProductName FROM product;
3. 查看視圖
查看視圖是指查看數據庫中已存在的視圖的定義,查看視圖要有SHOW VIEW權限。
查看視圖的方法包括:DESCRIBE、SHOW TABLE STATUS、SHOW CREATE VIEW及查詢information_schema數據庫下的views表。
3.1 DESCRIBE語句查看視圖基本信息
語法格式:
DESCRIBE view_name
示例:
mysql> DESC vproduct; +-------------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------------+-------------+------+-----+---------+-------+ | ProductID | int(11) | NO | | NULL | | | ProductName | varchar(50) | YES | | NULL | | +-------------+-------------+------+-----+---------+-------+
3.2 SHOW TABLE STATUS語句查看視圖基本信息
語法格式:
SHOW TABLE STATUS LIKE 'view_name'
示例:
mysql> SHOW TABLE STATUS LIKE 'vproduct';
mysql> show table status like 'vproduct'\G
*************************** 1. row ***************************
Name: vproduct
Engine: NULL
Version: NULL
Row_format: NULL
Rows: NULL
Avg_row_length: NULL
Data_length: NULL
Max_data_length: NULL
Index_length: NULL
Data_free: NULL
Auto_increment: NULL
Create_time: NULL
Update_time: NULL
Check_time: NULL
Collation: NULL
Checksum: NULL
Create_options: NULL
Comment: VIEW
1 row in set (0.00 sec)
執行結果顯示,Comment值為VIEW,說明該表為視圖。存儲引擎、數據長度等信息都顯示為NULL,說明視圖是虛擬表。
3.3 SHOW CREATE VIEW語句查看視圖詳細信息
語法格式:
SHOW CREATE VIEW view_name
示例:
mysql> SHOW CREATE VIEW vproduct\G
*************************** 1. row ***************************
View: vproduct
Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `vproduct` AS select `product`.`ProductID` AS `ProductID`,`product`.`ProductName` AS `ProductName` from `product`
character_set_client: gbk
collation_connection: gbk_chinese_ci
1 row in set (0.11 sec)
3.4 在views表中查看視圖詳細信息
mysql> SELECT * FROM information_schema.views WHERE TABLE_NAME='vproduct'\G
*************************** 1. row ***************************
TABLE_CATALOG: def
TABLE_SCHEMA: portal
TABLE_NAME: vproduct
VIEW_DEFINITION: select `portal`.`product`.`ProductID` AS `ProductID`,`portal`.`product`.`ProductName` AS `ProductName` from `portal`.`product`
CHECK_OPTION: NONE
IS_UPDATABLE: YES
DEFINER: root@localhost
SECURITY_TYPE: DEFINER
CHARACTER_SET_CLIENT: gbk
COLLATION_CONNECTION: gbk_chinese_ci
1 row in set (0.00 sec)
4. 修改視圖
MySQL中通過CREATE OR REPLACE VIEW語句和ALTER語句來修改視圖。
4.1 CREATE OR REPLACE VIEW語句修改視圖
CREATE OR REPLACE VIEW語句可以用來修改視圖,在視圖已存在的情況下,修改視圖;視圖不存在時,創建視圖。
CREATE OR REPLACE VIEW語法格式:
CERATE OR REPLACE [ALGORITHM = { UNDEFINED | MERGE | TEMPTABLE }] VIEW view_name [(column_name, .. ,column_name)] AS SELECT statement [WITH [CASCADED | LOCAL] CHECK OPTION];
示例:
mysql> CREATE OR REPLACE VIEW vproduct -> AS -> SELECT ProductID,ProductName FROM product;
4.2 ALTER語句修改視圖
ALTER VIEW語法格式:
ALTER [ALGORITHM = { UNDEFINED | MERGE | TEMPTABLE }] VIEW view_name [(column_name, .. ,column_name)] AS SELECT statement [WITH [CASCADED | LOCAL] CHECK OPTION];
示例:
mysql> ALTER VIEW vproduct -> AS -> SELECT ProductID,ProductName FROM product -> WITH CASCADED CHECK OPTION;
5. 刪除視圖
刪除視圖是指刪除數據庫中已存在的視圖。刪除視圖時,只能刪除視圖的定義,不會刪除數據。
語法形式:
DROP VIEW [IF EXISTS] view_name,[view_name] [RESTRICT | CASCADE]
其中,IF EXISTS判斷視圖存在,若存在則執行,不存在則不執行。刪除多個視圖之間使用逗號隔開。
示例:
mysql> DROP VIEW IF EXISTS vproduct;
