数据库视图详解 - 定义: 视图(View)是从一个或多个表(或视图)导出的表。视图与表(有时为与视图区别,也称表为基本表——Base Table)不同,视图是一个虚表,即视图所对应的数据不进行实际存储,数据库中只存储视图的定义,在对视图的数据进行操作时,
数据库视图详解
<code>视图(View)是从一个或多个表(或视图)导出的表。视图与表(有时为与视图区别,也称表为基本表——Base Table)不同,视图是一个虚表,即视图所对应的数据不进行实际存储,数据库中只存储视图的定义,在对视图的数据进行操作时,系统根据视图的定义去操作与视图相关联的基本表。 </code>
视图就像一个窗口,透过它可以看到数据库中自己感兴趣的数据及其变化
- 视图的创建
SQL Server创建视图的语法:
<code> <span><span>CREATE</span> <span>VIEW</span> [ .] [ .] view_name [ ( column [ ,...n ] ) ] [ WITH [ ,...n ] ] AS select_statement [ WITH CHECK OPTION ] ::= { ENCRYPTION | SCHEMABINDING | VIEW_METADATA } </span></code>
<code><span><span>create</span> <span>view</span> S_view1 <span>as</span> <span>select</span> sno,sname,sex <span>from</span> s <span>where</span> age><span>20</span> ;</span> </code>
<code> <span><span>create</span> <span>view</span> v_score1 <span>As</span> <span>Select</span> s.sno,s.sname,c.cname,sc.score <span>From</span> s,c,sc <span>Where</span> s.sno=sc.sno <span>and</span> c.cno=sc.cno <span>and</span> sno= “<span> 200300</span>01” ; </span></code>
<code><span><span>Create</span> <span>view</span> IS_Student <span>AS</span> <span>select</span> Sno,Sname,Sage <span>from</span> Student <span>where</span> Sdept=<span>'IS'</span> <span>with</span> <span>check</span> <span>option</span>;</span> </code>
<code> 在上述视图上加了with check option子句,以后对该视图进行插入、修改和删除操作时,RDBMS都会自动加上Sdept='IS' 行列子集视图: 如果一个视图只是从单个基本表导出的,并且只是去掉了某些行列,但保留了主键,称之为行列子集视图如上面例1和例3就是一个行列子集视图 </code>
视图定义好之后就可以像对基本表一样进行查询了
<code><span><span>select</span> Sno,Sage <span>from</span> IS_Student <span>where</span> Sage20</span>; </code>
对应的转换后的语句为
<code><span><span>select</span> Sno,Sage <span>from</span> Student <span>where</span> Sdept=<span>'IS'</span> <span>and</span> Sage20</span>; </code>
有时候,单单一个视图并不能查询到需要的数据,如例5
<code><span><span>select</span> IS_Student.Sno,Sname <span>from</span> IS_Student,SC <span>where</span> IS_Student.Sno=SC.Sno <span>and</span> SC.Cno=<span>'1'</span>;</span> </code>
上述查询涉及视图IS_Student和基本表SC共同查询得到结果
更新视图是指通过视图来插入、删除和修改数据
由于视图是不实际存储数据的虚表,因此对视图的更新最终要转换为对基本表的更新。所以为了防止用户对数据有意无意的操作,可在定义视图时加上 with check option 如例3
<code><span><span>Update</span> IS_Student <span>set</span> Sname=<span>'张大屁' where Sno='2000215122'; </span></span></code>
转换后对应的语句为
<code><span><span>Update</span> Student <span>set</span> Sname=<span>'张大屁' where Sno='200215122' and Sdept='IS'; </span></span></code>
<code><span><span>insert</span> <span>into</span> IS_Student <span>values</span>(<span>'200215129'</span>,<span>'李红',21); </span></span></code>
转换后的语句为
<code><span><span>insert</span> <span>into</span> Student(Sno.Sname,Sage,Sdept) <span>values</span>(<span>'200215129'</span>,<span>'李红',21,'IS'); </span></span></code>
<code><span><span>delete</span> <span>from</span> IS_Student <span>where</span> Sno=<span>'200215111'</span>;</span> </code>
转换后的语句为
<code><span><span>delete</span> <span>from</span> Student <span>where</span> Sno=<span>'200215111'</span> <span>and</span> Sdept=<span>'IS'</span>;</span> </code>
视图更新的限制
如果视图定义中有如下子句则不能更新
视图删除格式为
<code><span><span>DROP</span> <span>VIEW</span> [CASCADE] ; </span></code>
视图删除后视图的定义将从数据字典中删除,使用CASCADE是级联删除,删除此视图上导出的视图
<code><span><span>Drop</span> <span>VIEW</span> IS_Student;</span> </code>
<code>视图不仅可以简化用户对数据的理解,也可以简化他们的操作。那些被经常使用的查询可以被定义为视图,从而使用户不必为以后的操作每次都指定全部的条件。 </code>
<code>视图可以使应用程序和数据库表在一定程度上独立。如果没有视图,应用一定是建立在表上的。有了视图之后,程序可以建立在视图之上,从而程序与数据库表被视图分割开来。 </code>
<code> 通过视图用户只能查询和修改他们所能见到的数据。数据库中的其他数据则既看不见也取不到。数据库授权命令可以使每个用户对数据库的检索限制到特定的数据库对象上,但不能授权到数据库特定行和特定的列上。通过视图,用户可以被限制在数据的不同子集上。 </code>
视图的缺点
● 性能:SQL Server必须把视图的查询转化成对基本表的查询,如果这个视图是由一个复杂的多表查询所定义,那么,即使是视图的一个简单查询,SQL Server也把它变成一个复杂的结合体,需要花费一定的时间。
● 修改限制:当用户试图修改视图的某些行时,SQL Server必须把它转化为对基本表的某些行的修改。对于简单视图来说,这是很方便的,但是,对于比较复杂的视图,可能是不可修改的。