### 什么是视图
通俗的讲,视图就是一条 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)