视图就像一个窗口,透过它可以看到数据库中自己感兴趣的数据及其变化
SQL Server创建视图的语法:
CREATE VIEW [ < database_name > .] [ < owner > .] view_name [ ( column [ ,...n ] ) ] [ WITH < view_attribute > [ ,...n ] ] AS select_statement [ WITH CHECK OPTION ] < view_attribute > ::= { ENCRYPTION | SCHEMABINDING | VIEW_METADATA }
例1:建立显示年龄大于20岁的学生学号、姓名、性别等信息的S_view1 create view S_view1 as select sno,sname,sex from s where age>20 ; 例2:创建v_score1,要求基本表来源:S,C,SC;选择的字段为:S表中的sno、sname;C表中的cname及SC表中score;要求查询的数据为学号为20030001的学生的考试成绩。 create view v_score1 As Select s.sno,s.sname,c.cname,sc.score From s,c,sc Where s.sno=sc.sno and c.cno=sc.cno and sno= “ 20030001” ; 例3:建立信息系学生的视图,并要求进行修改和插入操作时仍需保证该视图只有信息系的学生 Create view IS_Student AS select Sno,Sname,Sage from Student where Sdept='IS' with check option; 在上述视图上加了with check option子句,以后对该视图进行插入、修改和删除操作时,RDBMS都会自动加上Sdept='IS' 行列子集视图: 如果一个视图只是从单个基本表导出的,并且只是去掉了某些行列,但保留了主键,称之为行列子集视图如上面例1和例3就是一个行列子集视图
视图定义好之后就可以像对基本表一样进行查询了
例 4 在信息系学生中查找年龄小于20的 select Sno,Sage from IS_Student where Sage<20;对应的转换后的语句为
select Sno,Sage from Student where Sdept='IS' and Sage<20;有时候,单单一个视图并不能查询到需要的数据,如例5
例5 查询选修了1号课程的信息系学生 select IS_Student.Sno,Sname from IS_Student,SC where IS_Student.Sno=SC.Sno and SC.Cno='1';上述查询涉及视图IS_Student和基本表SC共同查询得到结果
更新视图是指通过视图来插入、删除和修改数据
由于视图是不实际存储数据的虚表,因此对视图的更新最终要转换为对基本表的更新。所以为了防止用户对数据有意无意的操作,可在定义视图时加上 with check option 如例3
例 6 将信息系学生视图IS_Student 好、中学号为200215122的学生姓名改为"张大屁" Update IS_Student set Sname='张大屁' where Sno='2000215122';转换后对应的语句为
Update Student set Sname='张大屁' where Sno='200215122' and Sdept='IS'; 例7 向信息系学生视图中插入一个新的学生记录 学号为200215129 姓名为 ‘李红’ 年龄为21 insert into IS_Student values('200215129','李红',21);转换后的语句为
insert into Student(Sno.Sname,Sage,Sdept) values('200215129','李红',21,'IS'); 例8 删除信息系学生学号为200215111的学生 delete from IS_Student where Sno='200215111';转换后的语句为
delete from Student where Sno='200215111' and Sdept='IS';视图更新的限制
如果视图定义中有如下子句则不能更新
分组 使用group by 和 Having联结子查询并集聚集函数 MAX MIN COUNT AVGDISTINCT导出列视图删除格式为
DROP VIEW <视图名> [CASCADE] ;视图删除后视图的定义将从数据字典中删除,使用CASCADE是级联删除,删除此视图上导出的视图
例9 删除视图IS_Student Drop VIEW IS_Student;视图的缺点
● 性能:SQL Server必须把视图的查询转化成对基本表的查询,如果这个视图是由一个复杂的多表查询所定义,那么,即使是视图的一个简单查询,SQL Server也把它变成一个复杂的结合体,需要花费一定的时间。
● 修改限制:当用户试图修改视图的某些行时,SQL Server必须把它转化为对基本表的某些行的修改。对于简单视图来说,这是很方便的,但是,对于比较复杂的视图,可能是不可修改的。