### 什么是視圖
通俗的講,視圖就是一條 SELECT 語句執行后返回的結果集。所以我們在創建視圖的時候,主要的工作就落在創建這條SQL查詢語句上。
### 視圖的特性
視圖是對若干張基本表的引用,一張虛表,查詢語句執行的結果,不存儲具體的數據(基本表數據發生了改變,視圖也會跟著改變)
可以跟基本表一樣,進行增刪改查操作(有條件限制)
### 視圖的作用
方便操作,特別是查詢操作,減少復雜的SQL語句,增強可讀性。
更加安全,數據庫授權命令不能限定到特定行和特定列,但是通過合理創建視圖,可以把權限限定到行列級別。
### 使用場合
權限控制的時候,不希望用戶訪問表中某些含敏感信息的列,比如 聯系方式,薪資等。
關鍵信息來源于多個復雜關聯表,可以創建視圖提取我們需要的信息,簡化操作。
### 創建視圖
語法如下:
CREATE [OR REPLACE]
[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
[DEFINER = { user | CURRENT_USER }]
[SQL SECURITY { DEFINER | INVOKER }]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
創建一個北京總公司(office_id = 1000)雇員的視圖:
CREATE OR REPLACE VIEW view_bj_employees (id, name, office) AS (
SELECT employee_id, employee_name, office_id FROM employee
WHERE office_id = 1000
);
從 *view_bj_employees* 視圖中查詢數據:
SELECT * FROM view_bj_employees;
SELECT * FROM view_bj_employees WHERE gender = '男';
SELECT * FROM view_bj_employees WHERE dept_id = 1000; // unknown column 'dept_id' in 'where clause'
### 修改視圖
語法如下:
ALTER OR REPLACE
[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
[DEFINER = { user | CURRENT_USER }]
[SQL SECURITY { DEFINER | INVOKER }]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
### 查看視圖
使用 show tables 命令不僅顯示表的名字,同時也顯示視圖的名字,而不存在單獨的顯示視圖的 show views 命令。
show tables;
使用 show create view 或者 desc 命令可以查看視圖的定義:
show create view pk_employee_view;
desc view_bj_employees;
### 更新視圖
更新視圖是指通過視圖來插入、更新、刪除表數據,因為視圖是虛表,其中沒有數據。如果對視圖插入、更新、刪除記錄,實際上是對基表執行相應的操作。
插入數據:
INSERT INTO view_bj_employees (id, name, office) VALUES (null, '王大錘', 1000);
更新數據:
UPDATE view_bj_employees SET name='王大炊' WHERE id = 58;
UPDATE view_bj_employees SET name='王大炊' WHERE id = 17; // 記錄不在視圖范圍內(office_id=1002),更新失敗
刪除數據:
DELETE FROM view_bj_employees WHERE id = 58;
有的視圖是可更新的,有的是不可更新的,是有條件限制的,所以視圖最好當作查詢使用,更多細節請參考官方文檔。
### 刪除視圖
語法如下:
DROP VIEW [IF EXISTS]
view_name [, view_name] ...
[RESTRICT | CASCADE]
刪除 *view_bj_employees* 視圖:
drop view if exists view_bj_employees;
參考鏈接:
- [MySQL視圖講解](http://www.2cto.com/database/201508/427083.html)
- [Create View Syntax](https://dev.mysql.com/doc/refman/5.7/en/create-view.html)
- [Updatable and Insertable Views](https://dev.mysql.com/doc/refman/5.7/en/view-updatability.html)