数据库之定义视图

视图是从一张或多张基本表(或视图)导出的表。与基本表不同,数据库只会存放视图的定义,而视图中的数据还是存放在原来基本表中。视图是基本表的映射,如果基本表发生了变化,则从视图中查询出的数据也会相应地发生改变。视图的操作主要包含以下内容:

1、定义视图

sql语句用create view命令建立视图,其一般格式是:

create view <>[(<列名>[,<列名>]...)]

as <子查询>

[with check option];

其中,子程序可以是任意复杂的select语句,但通常不包括order by子句和distinct短语。with check option表示对视图进行update、insert、delete操作时要保证更新、插入、删除的行满足视图定义中的谓词条件(即子查询中的条件表达式)。

组成视图的属性列名或者全部省略或者全部指定,没有第三种选择。如果省略了视图的各个属性列名,则隐含视图的属性列名是由子查询select语句中的目标列名的字段组成的。但是有以下几种情况需要必须指定视图的所有列名:

(1)某个目标不是单纯的属性名,而是聚集函数或列表达式

(2)多表连接时选出了几个同名列作为视图的字段

(3)需要在视图中为某个列启用新的更合适的名字

例如,创建建立“IS”系学生的视图:

create view  IS_student

as

select Sno,Sname,Sage

from student

where Sdept='IS';

该实例中,省略了IS_student的列名,隐含了由子查询中select子句中的三个列名组成(即只有Sno,Sname,Sage)。这时候我们可以通过IS_student视图来查询IS系学生的信息了,如:select * from IS_student;//(只会显示Sno,Sname,Sage三个信息,因为创建视图时省略了列名,所以默认字段就是select语句中的字段)。

如果想创建这样一个信息系统学生的视图,要求进行修改和插入操作时仍须保证该视图只有信息系的学生,则可以这样:

create view  IS_student

as

select Sno,Sname,Sage

from student

where Sdept='IS'

with check option;//保证对该视图进行修改操作时,DBMS会自动添加Sdept="IS"条件。

再比如,创建一个反映学生出生年份的视图:

create view birth_student(Sno,Sname,Sbirth)

as

select Sno,Sname,2017-Sage

from student;

在select子句中,还可以使用带有聚集函数group by子句的查询来定义视图,这种视图称为“分组视图”。例如,创建学生的学号和他的平均成绩的视图:

create view SN_AV(Sno,Gave)

as

select Sno,AVG(grade)

from SC group by Sno;

因为as子句中select语句的平均成绩是通过聚集函数得到的,所以在create veiw语句中必须定义视图SN_AV的各个属性列名,而不能省略。

2、删除视图

删除视图的语句是:drop view <视图名>[cascade];该语句会将视图的定义从数据字典中删除。如果该视图还导出了其他视图,则使用cascade级联删除语句,可以将该视图以及由该视图导出的所有视图一起删除。

3、查询视图

视图的查询和对基本表的查询一样,例如,可以查询birth_student视图中的所有信息:

select * from birth_student;

再比如,查询SN_AV视图中,平均值大于等于90的学生号和平均分:

select * from SN_AV where Gave>90;

4、更新视图

更新视图的动作最终是要落实到具体的表上的,为了防止用户通过视图对数据进行更新时,有意或无意地对不属于视图范围以内的基本表数据进行修改,在定义视图时可以添加with check option子句。

4.1 插入语句

例如,将IS_student视图中的学号为20021215的学生姓名改为“张飞”:

update IS_student

set Sname="张飞"

where Sno="20021215";

在IS_student视图中添加一个新的学生记录,如下:

insert

into IS_student

values("20021218","赵子龙",20);

以上语句兑换成更新表的语句是:

insert

into student(Sno,Sname,Sage,Sdept)

values("20021218","赵子龙",20,"IS");

4.2 删除语句

例如,删除IS_student表中的学号为20021215的记录:

delete

from IS_student

where Sno="20021215";

4.3 更新语句

例如,更改IS_student表中的学号为20021215的学生姓名为”关羽“:

update IS_student

set Sname="关羽"

where Sno="20021215";

视图的作用主要有以下几点:

1)视图对重构数据库提供了一定的逻辑独立性

数据的物理独立性是指用户的应用程序不应依赖于数据库的物理结构;逻辑独立性是指当数据库重构造时,如增加新的关系或对原有关系增加新的字段等,用户的应用程序不应受到影响。在关系数据库中,重构数据库最常见的是将一个基本表”垂直“地分为多个基本表,例如将学生关系:

student(Sno,Sname,Ssex,Sage,Sdept)

分为SX(Sno,Sname,Ssex)和SY(Sno,Sage,Sdept)两个关系,这是student表是SY和SX两个表自然连接的结果。如果建立一个student视图:

create view student(Sno,Sname,Ssex,Sage,Sdept)

as

select SX.Sno,SX.Sname,SX.Ssex,SY.sage,SY.Sdept

from SX,SY

where SX.Sno=SY.Sno;

这样尽管数据库的逻辑结构变了(变为SX和SY两个表),但是应用程序不必改变。

2)视图能够对机密数据提供安全保护

有了视图机制,在设计数据库应用系统时,可以对不同用户定义不同的视图,使得具有机密性的数据不会出现在不应当看到这些数据的用户视图上。

原文地址:https://www.cnblogs.com/codeMedita/p/7620320.html