Loading

02-视图

视图是从一个或几个基本表(或视图)导出的表。它与基本表不同,是一个虚表。数据库中只存放视图的定义,而不存放视图对应的数据,这些数据仍存放在原来的基本表中。所以一旦基本表中的数据发生变化,从视图中查询出的数据也就随之改变了。从这个意义上讲,视图就像一个窗口,透过它可以看到数据库中自己感兴趣的数据及其变化。

视图一经定义,就可以和基本表一样被查询、被删除。也可以在一个视图之上再定义新的视图,但对视图的更新(增、删、改)操作则有一定的限制。

  • 重用 SQL 语句
  • 简化复杂的 SQL 操作,不必知道它的查询细节
  • 保护数据,提高安全性

1. 定义视图

SQL 语言用 CREATE VIEW 命令建立视图,其一般格式为:

CREATE VIEW <视图名> [(<列名> [, <列名>] ...)]
AS <子查询>
[WITH CHECK OPTION];
  • 其中,子查询可以是任意的 SELECT 语句;
  • WITH CHECK OPTION 表示对视图进行 UPDATE、INSERT 和 DELETE 操作时要保证更新、插入或删除的行满足视图定义中的谓词条件(即子查询中的条件表达式);
  • 组成视图的属性列名或者全部省略或者全部指定,没有第 3 种选择。如果省略了视图的各个属性列名,则隐含该视图由子查询中 SELECT 子句目标列中的诸字段组成;
  • e.g. 查询姓名中包含 'a' 字符的员工名、部门名和工种信息

2. 删除视图

语句的格式为:DROP VIEW <视图名> [RESTRICT | CASCADE];

视图删除后视图的定义将从数据字典中删除。如果该视图上还导出了其他视图,则使用 CASCADE 级联删除语句把该视图和由它导出的所有视图一起删除。

基本表删除后,由该基本表导出的所有视图均无法使用了,但是视图的定义没有从字典中清除。删除这些视图的定义需要显式地使用 DROP VIEW 语句。

3. 查询视图

CREATE VIEW 语句的结果只是把视图的定义存入数据字典,并不执行其中的 SELECT 语句。只是在对视图查询时,才按视图的定义从基本表中将数据查出。

查看视图的创建语句:SHOW CREATE VIEW <视图名>;

DBMS 执行对视图的查询时,首先进行有效性检查,检查查询中涉及的表、视图等是否存在。如果存在,则从数据字典中取出视图的定义,把定义中的子查询和用户的查询结合起来,转换成等价的对基本表的查询,然后再执行修正了的查询。这一转换过程称为”视图消解“。

  1. 创建视图 v1,要求查询电话号码以 '011' 开头的员工姓名、工资和邮箱;
  2. 创建视图 v2,要求查询部门的最高工资大于 12000 的部门信息;

4. 更新视图

更新视图是指通过视图来插入、删除和修改数据。

由于视图是不实际存储的虚表,因此对视图的更新最终要转换为对基本表的更新。像查询视图那样,对视图的更新操作也是通过视图消解,转换为对基本表的更新操作

在关系数据库中,并不是所有的视图都是可更新的,因为有些视图的更新不能唯一地有意义地转换成相应基本表的更新。一般地,行列子集视图是可更新的。

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

  • 包含以下关键字的 SQL 语句:分组函数、distinct、group by、having、union 或者 union all
  • 常量视图
  • SELECT 中包含子查询
  • JOIN
  • FROM 一个不能更新的视图
  • WHERE 子句的子查询引用了 FROM 子句中的表
posted @ 2020-09-06 19:02  tree6x7  阅读(213)  评论(0编辑  收藏  举报