一、视图的概念
视图是一个虚表;数据库中只存放视图的定义;视图对应的数据仍存放在原来的表中;随着表中数据的变化,视图的数据随之改变。
对视图的查询与基本表一样;对视图的更新将受到一定的限制。
二、视图分类
1.行列子集视图:从单个基本表导出,保留基本表的码,但去掉其它的某些列和部分行的视图。
2.表达式视图:带虚拟列的视图。
3.分组视图:子查询目标表带有组函数或子查询带有GROUP BY子句的视图。
三、定义与修改视图
建立视图,其一般格式为:
CREATE VIEW <视图名>[(<列名>[,<列名>]...)] AS <子查询>[WITH CHECK OPTION]
其中子查询可以是任意复杂的SELECT语句,但通常不允许含有ORDER BY子句和DISTINCT短语。
WITH CHECK OPTION表示对视图进行UPDATE、INSERT和DELETE操作时要保证更新、插入或删除的行满足视图定义中的谓词条件(即子查询中的条件表达式)。
如果CREATE VIEW语句仅指定了视图名,省略了组成视图的各个属性列名,则隐含该视图由子查询中SELECT子句目标列中的诸字段组成。
在下列三种情况下必须明确指定组成视图的所有列名:
其中某个目标列不是单纯的属性名,而是集函数或列表达式;
多表连接时选出了几个同名列作为视图的字段;
需要在视图中为某个列启用新的更合适的名字;
需要说明的是,组成视图的属性列名必须依照上面的原则,或者全部省略或者全部指定,没有第三种选择。
例: 建立电商系学生的视图 --- 行列子集视图
create view ec_student
as select sno , sname , age from student where dept = 'ec';
例: 建立电商学生的视图,并要求进行修改和插入操作时仍须保证该视图只有电商系的学生
create view ec_student as select sno,sname, age from student where sdept='ec' with check option
insert into ec_student (sno,sname,age,dept) values ('2001','Rain Man', 20 , 'ec')
insert into ec_student (sno,sname,age,dept) values ('2001','Rain Man', 20 , '会计') /* 插入失败*/
视图不仅可以建立在单个基本表上,也可以建立在多个基本表上或者已定义好的视图。
例:建立电商系选修了号课程的学生的视图
create view ec_s1(xh,xm,cj)
as
select student.sno,sname,score from student,sc
where dept='ec' and student.sno=sc.sno and sc.cno='001'
带表达式的视图:
例:定义一个反映学生出生年份的视图
CREATE VIEW BT_S(sno,sname,csnf)
as
select sno,sname,2005-age from student
分组视图:带有集函数和GROUP BY子句的查询
例: 将学生的学号及他的平均成绩定义为一个视图
CREATE VIEW S_G(sno,avgscore)
AS
SELECT sno, AVG(score) FROM sc GROUP BY sno
三、删除视图
DROP VIEW <视图名>
一个视图被删除后,由此视图导出的其他视图也将失效,用户应该使用DROP VIEW语句将他们一一删除。
四、关于更新的限制
并非所有的视图都可更新,有些视图的更新不能唯一地有意义地转换成对相应基本表的更新。
1、若视图是由两个以上基本表导出的,则此视图不允许更新。
2、若视图的字段来自字段表达式或常数,则不允许对此视图执行INSERT和UPDATE操作,但允许执行DELETE操作。
3、若视图的字段来自集函数,则此视图不允许更新。
4、若视图定义中含有GROUP BY子句,则此视图不允许更新。
5、若视图定义中含有DISTINCT短语,则此视图不允许更新。
五、视图的作用
1、视图能够简化用户的操作
2、视图使用户能以多种角度看待同一数据
3、视图对重构数据库提供了一定程度的逻辑独立性
4、视图能够对机密数据提供安全保护