SQL Sever 视图

      视图是一个或几个基本表(或视图)到导出的表。它与基本表不同是一个虚表。数据库中只存放视图的定义,而不存放对应的数据。视图就像一个窗口,透过它可以看到自己感兴趣的数据及其变化。

      视图一经定义,就可以和基本表一样被查询、删除。也可以在一个视图之上定义新视图。

先来看一下我的表吧:

                                    

                        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'

4)若视图中含有group by、distinct则不能修改

5)若视图含有多个基本表,则不能插入





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值