1. 生成历史
mysql从5.0.1版本开始提供视图功能。
2. 基本概念和意义
视图是一种虚拟存在的表,对于使用视图的用户来说基本上是透明的。视图并不是在数据库中实际存在,行和列来自自定义视图的查询中使用的表,并且实在使用视图时动态生成的。这里可以把视图看成一个子查询,视图就代替了整个子查询语句,在使用的时候可以直接将该子查询替换为视图的名字。
视图相对于普通的表的优势:
- 简单:使用视图的用户完全不用关心后面对应的表结构、关联条件和筛选条件,对用户来说已经是过滤好的复合条件的结果集。
- 安全:使用视图的用户只能访问他们被允许查询的结果集,对表的权限管理并不能限制到某个行某个列,但通过视图可以简单的实现。
- 数据独立:一旦视图的结构确定了,可以屏蔽表结构变化对用户的影响,源表增加列对视图没有影响;源表修改列名,则可以通过修改视图来解决,不会在成对访问者的影响。
3. 视图操作
视图的操作包括:创建或修改视图、删除视图以及查看视图定义。
3.1 创建和修改视图
创建视图需要有create view的权限,并对于查询涉及的列右select权限。如果使用create or replace或者alter修改视图,那么还需要该视图的drop权限。
创建视图的语法如下:
create [or replace] [algorithm = {undefined | merge | temptable}]
view view_name [(column_list)]
as select_statement
[with [cascade | local] check option]
修改视图的语法如下:
alter [alhorithm = {undefined | merge | temptable}]
view view_name [(column_list)]
as select_statement
[with [cascade | local] check option]
mysql视图的定义有一些限制,比如:在5.7.7版本之前,from关键字后面不能有子查询,者和其他数据库是不同的,如果视图是从其他数据库迁移过来的,可能需要做一下改动。
3.2 删除视图
用户可以一次删除一个或多个视图,前提是必须有该视图的drop权限。
drop view [if exist] view_name [, view_name]...[restart | cascade]
例如:删除staff_list视图:
3.3 查看视图
从mysql5.1版本开始,使用show tables命令的时候不仅显示表的名字,同时也会显示视图的名字,而不存在单独显示视图的show views命令。
同样也可以使用show table status命令,这个时候不仅可以显示表信息,同时也显示了视图信息,Comment字段标识view的表即为视图。
如果要查看某个视图的定义,可以使用show create view命令进行查看:
最后,通过系统表information_schema.views也可以查看视图的相关信息。