环境
DBMS:MySQL 8.0.17
工具:Navicat Premium 11.2.16
概述
视图是从一个或多个基本表导出的虚表。数据库中只存放视图的定义,而不存放视图对应的数据,这些数据仍存放在原来的基本表中。所以一旦基本表中的数据发生变化,从视图中查询出的数据也会随之改变。
视图有以下优点:
- 视图能够简化用户的操作。
- 视图使用户能以多种角度看待同一数据。
- 视图对重构数据库提供了一定程度的逻辑独立性。
- 视图能够对机密数据提供安全保护。
- 适当利用视图可以更清晰地表达查询。
创建
CREATE VIEW <视图名> AS <子查询>;
与基本表一样,视图名也是唯一标识一个视图,所以视图名不能重复。
不同的是,创建视图不是使用if not exists判断是否存在同名视图,而是使用create or replace,表示不存在同名视图则创建视图,存在同名视图则替换视图。
CREATE OR REPLACE VIEW <视图名> AS <子查询>;
创建学生选课视图v_sc:
修改
ALTER VIEW <视图名> AS <子查询>;
注意修改是使用alter关键字而不是用replace关键字。
修改视图v_sc,增加成绩列:
删除
DROP VIEW <视图名>;
删除视图不能使用is exists判断视图是否存在。
删除视图v_sc:
查看
DESC <视图名>;
数据查询
视图的数据查询与基本表的数据查询一样。视图和视图之间、基本表和视图之间都可以进行连接查询、嵌套查询和派生表查询。
关系型数据库执行对视图的查询时,首先进行有效性检查,检查查询中涉及的表、视图等是否存在。如果存在,则从数据字典中取出视图的定义,把定义中的子查询和用户的查询结合起来,转换成等价的对基本表的查询,然后再执行修正了的查询。这一转换过程称为视图消解。
数据操作
由于视图是不实际存储数据的虚表,对视图的更新最终要转换为对基本表的更新。与视图查询一样,视图的更新操作也是通过视图消解转换为对基本表的更新操作。
并不是所有的视图都可以更新。对于MySQL而言,以下视图不能进行更新:
- 视图的字段中包含表达式、常数或函数。
- 定义视图的子查询为分组查询、连接查询。
- 定义视图时使用了distinct关键字去掉重复字段。