什么是视图

视图(view)是一种虚拟存在的表,对于使用视图的用户来说基本上是透明的。视图并不存在数据库中真实存在,行和列数据来自定义视图的查询中使用的表,并且是在使用时动态生成的。

使用视图的优势

  • 简单:使用视图的用户完全不需要关心后面对应的表的结构、关联条件和筛选条件,对用户来说已经是过滤好的符合条件的结果集
  • 安全:使用视图的用户只能访问他们被允许查询的结果集,对应的权限管理并不能限制到某个行某个列,但是通过视图就可以简单的实现
  • 数据独立:一单视图的结构确定了,可以屏蔽表结构变化对用户的影响、源表增加列队视图没有影响;源表修改列名,则可以通过修改视图来解决,不会造成对访问者的影响

创建与修改视图

1
2
3
4
create or replace view country_city_view as
select c.country_id as id, country, city, c.last_update
from country
right join city c on country.country_id = c.country_id;

MySQL5.7.7 之前 FROM 关键字后面不能包含子查询。

视图的更新性与视图中查询的定义有关,以下类型的视图是不可更新的

  • 包含以下关键字的语句:聚合函数(SUM,MIN,COUNT 等)、DISTINCT、GROUP BY、HAVING、UNION 或者 UNION ALL
  • 常量视图
  • SELECT 中包含子查询
  • JOIN
  • FROM 一个不能更新的视图
  • WHERE 字句的子查询引用了 FROM 字句中的表

WITH [CASCADED]|[LOCAL] CHECK OPTION 决定了是否允许更新数据是记录不再满足视图的条件

  • LOCAL 只要满足本视图的条件就可以更新
  • CASCADED 则必须满足所有针对该视图的所有视图的条件才可以更新

如果没有明确是 LOCAL 还是 CASCADED 则默认是 CASCADED

删除视图

用户可以一次性删除多个视图

1
drop view test1,test2,test3

查看视图

从 MySQL5.1 版本开始,使用 SHOW_TABLES 命令的时候不仅显示表的名字,同时也会显示视图的名字,而不存在单独显示视图的 SHOW VIEWS 命令。

show tables;

同样,在使用 SHOW TABLE STATUS 命令的时候,不但可以显示表的信息,同时也可以显示视图的信息。

show table status like 'country_city_view';

如果要查询某个视图的定义,可以使用 SHOW CREATE VIEW 命令进行查看

show create view country_city_view;

通过查看系统表

1
2
use information_schema
select * from VIEWS where TABLE_NAME = 'country_city_view'