视图一经定义,就可以和基本表一样被查询、删除。也可以在一个视图之上定义新视图。
先来看一下我的表吧:
Student表 SC表
1、 建立视图
一般格式为
Create view <视图名> <列名>
As <子查询>
[with check option]
a. 子查询是任意select语句,SQL Sever中允许使用distinct,但不允许使用order by。
b. With check option表示之后对视图进行update、insert、和delete操作是要保证更新、插入、删除要满足子查询中的条件表达式。
c.组成视图的属性列名或者全部忽略或者全部指定,没有第三种选择。当某个列不是单纯的属性名,而是聚集函数或列表达式或多表连接时选出了几个同名列作为视图的字段时,必须明确指定组成视图的所有列名。
我们来查看学生的选课得分情况:
create view student_view(学生号,名字,课程号,分数)
as select studentId,studentName,cno,grade
from student,sc
where studentId=sno
with check option
select *from student_view
结果如图:
上面的视图是建立在两个基本表上的,若一个视图是由一个基本表导出,并只是去掉了基本表的某些行和某些列,但保留了主码,则称这类视图为行列子集视图。
2、 删除视图
很简单:drop viewstudent_view
3、 查询视图
查询视图基本操作与查询表差不多,具体请看我之前的文章:SQL Sever 查询操作
这里要说一下执行步骤:首先进行有效性检查,检查查询中涉及到表、视图等是否存在。如果存在,则从数据字典中取出该视图的定义(之前也说了视图是虚表,只是定义在数据字典里),把定义中的子查询和用户的查询结合起来,转换成等价的对基本表的查询,然后执行修正了的查询。这一转换过程称为视图消解(view resolution)。
目前数据库系统对行列子集视图的查询均能正确转换,但对非行列子集视图的查询转换并不稳定,因此这类查询应该直接对基本表进行。
4、 更新视图
更新视图指通过视图来插入(insert)、删除(delete)、和修改(update)数据。再强调一下,对视图的更新最终要转换为对基本表的更新。
并不是所有数据库都能更新。
1) 经过我的实验,我发现如果视图中的一个属性(列)蕴含在两个基本表中,这时不能修改。例如:
update student_view set 学生号='1000000'
where 学生号='1120161668';
2)当定义视图时带有“with check option”时,违背了完整性约束条件的,不能修改。
3)对于聚集函数得出的常量不可修改
create view test_view(学生号,名字,平均分数)
as select sno,studentName,avg(Grade)
from student,sc
where studentId=Sno
group by Sno,studentname
with check option
如图:
当我修改时:update test_view set 平均分数='100' where 名字='zunber'