好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

数据库视图详解

数据库视图详解 - 定义: 视图(View)是从一个或多个表(或视图)导出的表。视图与表(有时为与视图区别,也称表为基本表——Base Table)不同,视图是一个虚表,即视图所对应的数据不进行实际存储,数据库中只存储视图的定义,在对视图的数据进行操作时,

数据库视图详解

- 定义:

 视图(View)是从一个或多个表(或视图)导出的表。视图与表(有时为与视图区别,也称表为基本表——Base Table)不同,视图是一个虚表,即视图所对应的数据不进行实际存储,数据库中只存储视图的定义,在对视图的数据进行操作时,系统根据视图的定义去操作与视图相关联的基本表。
  

视图就像一个窗口,透过它可以看到数据库中自己感兴趣的数据及其变化

- 视图的创建

SQL Server创建视图的语法:

 
  CREATE   VIEW   

[   .] [   .]  

    view_name [ ( column [ ,...n ] ) ]  

   [ WITH   [ ,...n ] ]  

AS  

select_statement   
   [ WITH CHECK OPTION ]  

  ::=  

 { ENCRYPTION | SCHEMABINDING |  

      VIEW_METADATA }  
   

WITH check OPTION 表示对视图进行UPDATE、INSERT、delete操作时要保证更新、删除、或插入的行满足视图定义中的谓词条件 例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=  “   200300 01”  ;
   
例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 AVG DISTINCT 导出列

- 视图的删除

视图删除格式为

   DROP   VIEW    [CASCADE] ;
   

视图删除后视图的定义将从数据字典中删除,使用CASCADE是级联删除,删除此视图上导出的视图

例9 删除视图IS_Student
   Drop   VIEW  IS_Student; 
  

- 视图的优点

- 1简化用户操作

 视图不仅可以简化用户对数据的理解,也可以简化他们的操作。那些被经常使用的查询可以被定义为视图,从而使用户不必为以后的操作每次都指定全部的条件。 
  

- 2对重构数据库提供了一定程度上的逻辑独立性

 视图可以使应用程序和数据库表在一定程度上独立。如果没有视图,应用一定是建立在表上的。有了视图之后,程序可以建立在视图之上,从而程序与数据库表被视图分割开来。 
  

- 3安全性

  通过视图用户只能查询和修改他们所能见到的数据。数据库中的其他数据则既看不见也取不到。数据库授权命令可以使每个用户对数据库的检索限制到特定的数据库对象上,但不能授权到数据库特定行和特定的列上。通过视图,用户可以被限制在数据的不同子集上。 
  

视图的缺点

● 性能:SQL Server必须把视图的查询转化成对基本表的查询,如果这个视图是由一个复杂的多表查询所定义,那么,即使是视图的一个简单查询,SQL Server也把它变成一个复杂的结合体,需要花费一定的时间。

● 修改限制:当用户试图修改视图的某些行时,SQL Server必须把它转化为对基本表的某些行的修改。对于简单视图来说,这是很方便的,但是,对于比较复杂的视图,可能是不可修改的。

查看更多关于数据库视图详解的详细内容...

  阅读:76次