数据库系统概论——视图 & MySQL实现
特点
-
视图是一种虚拟的表,是从一个或几个基本表(视图)中导出的表
-
数据库管理系统只存放视图的定义(
SELECT
语句),而不存在相应数据 -
视图对应的基本表的数据发生变化,视图查询得到数据也随之变化
定义视图
格式
create view
<view name> [(<column name> [,<column name>])]
as <subquery>
[with check option];
其中with check option
对视图进行增删改时要保证操作的元组(行)满足视图定义中的谓词条件(即子查询中的条件表达式),组成视图的属性可以全部省略或全部指定,若全部省略则由子查询中SELECT
目标列中的诸多字段组成
关系数据库管理系统在执行CREATE VIEW
语句时只是把视图定义存入数据字典,并不执行SELECT
语句,视图查询时,按视图的定义从基本表中将数据查出
行列子集视图
行列子集视图指的是从单个基本表导出且只是去掉了基本表的某些行和列的视图
例如,以计算机科学系所有教师创建新视图cs_instructor
create view cs_instructor
as
select *
from instructor
where dept_name = 'CS';
查询视图
select * from cs_instructor;
多表视图
例如,以软件工程系所有教师的ID、名字、系名和办公楼建立新视图se_instructor
create view se_instructor(ID, name, dept_name, building)
as
select instructor.ID, instructor.name, instructor.dept_name, department.building
from instructor, department
where instructor.dept_name = 'SE' and
instructor.dept_name = department.dept_name;
视图之上的视图
例如,以计算机科学系教师的视图建立教师工资的新视图cs_instructor_salary
create view cs_instructor_salary(name, salary)
as
select name, salary
from cs_instructor;
表达式视图
例如,以计算机科学系教师的视图建立教师工资加1000
的新视图cs_instructor_salary
create view cs_instructor_salary(name, salary)
as
select name, salary + 1000
from cs_instructor;
分组视图
例如,建立各系教师平均工资的新视图cs_instructor_average_salary
create view cs_instructor_average_salary(dept_name, average_salary)
as
select dept_name, avg(salary)
from instructor
group by dept_name;
删除视图
格式
drop view <view name> [CASCADE];
其中,若添加了可选项CASCADE
,会将该视图和由它导出的所有视图一起删除
删除基本表时,由该基本表导出的所有视图定义都必须显示地被DROP VIEW
语句删除
查询视图
用户角度
从用户角度看,查询视图与基本表相同
数据库角度
关系数据库管理系统采用视图消解法
视图消解法(View Resolution
)会先进行有效性检查,然后将视图查询转换成等价的基本表查询,再执行修正后的查询,但有些情况视图消解法不能生成正确的对象
例如,查询视图中工资大于100000
的教师的信息
select *
from cs_instructor
where salary > 10000;
更新视图
修改视图数据
例如,增加计算机系教师视图中所有教师的薪水
update cs_instructor
set salary = salary + 1000;
等同于在基本表中使用如下语句修改
update instructor
set salary = salary + 1000;
where dept_name = 'CS';
插入数据到视图
例如,插入新教师到计算机系教师视图
insert
into cs_instructor
values ('10004', 'Tom', 'SE', 15000);
删除视图数据
例如,从计算机系教师视图删除名为Tony
的元组
delete
from cs_instructor
where name = 'Tom';
局限性
一些视图不可以被更新,因为这些视图的更新不能唯一有意义地转换成对相应基本表的更新,如通过聚集函数得到平均值、总和等
特点
-
更新视图也会更新被其导出的基本表的数据
-
可以对行列子集视图进行更新
-
对除了行列子集视图以外的更新不同系统有不同限制
-
一个不允许更新的视图上定义的视图也不允许更新
视图的作用
简化用户操作
-
基于多张表的视图
-
基于复杂嵌套的视图
-
含导出属性的视图
使用户能以多种角度看待同一数据
适应数据库共享的需求
为重构数据库提供了一定程度的逻辑独立性
为机密数据提供一定的安全保护
提供更清晰的的表达查询方式
鸣谢
最后
- 由于博主水平有限,不免有疏漏之处,欢迎读者随时批评指正,以免造成不必要的误解