Heim > Datenbank > MySQL-Tutorial > 数据库视图详解

数据库视图详解

WBOY
Freigeben: 2016-06-07 15:29:51
Original
2591 Leute haben es durchsucht

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

数据库视图详解

- 定义:

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

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

- 视图的创建

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>
Nach dem Login kopieren

WITH check OPTION 表示对视图进行UPDATE、INSERT、delete操作时要保证更新、删除、或插入的行满足视图定义中的谓词条件
  • 例1:建立显示年龄大于20岁的学生学号、姓名、性别等信息的S_view1
<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>
Nach dem Login kopieren
  • 例2:创建v_score1,要求基本表来源:S,C,SC;选择的字段为:S表中的sno、sname;C表中的cname及SC表中score;要求查询的数据为学号为20030001的学生的考试成绩。
<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>
Nach dem Login kopieren
  • 例3:建立信息系学生的视图,并要求进行修改和插入操作时仍需保证该视图只有信息系的学生
<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>
Nach dem Login kopieren
<code>    在上述视图上加了with check option子句,以后对该视图进行插入、修改和删除操作时,RDBMS都会自动加上Sdept='IS'

行列子集视图: 如果一个视图只是从单个基本表导出的,并且只是去掉了某些行列,但保留了主键,称之为行列子集视图如上面例1和例3就是一个行列子集视图
</code>
Nach dem Login kopieren

- 查询视图

视图定义好之后就可以像对基本表一样进行查询了

  • 例 4 在信息系学生中查找年龄小于20的
<code><span><span>select</span> Sno,Sage
<span>from</span> IS_Student
<span>where</span> Sage20</span>;
</code>
Nach dem Login kopieren

对应的转换后的语句为

<code><span><span>select</span> Sno,Sage
<span>from</span> Student
<span>where</span> Sdept=<span>'IS'</span> <span>and</span> Sage20</span>;
</code>
Nach dem Login kopieren

有时候,单单一个视图并不能查询到需要的数据,如例5

  • 例5 查询选修了1号课程的信息系学生
<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>
Nach dem Login kopieren

上述查询涉及视图IS_Student和基本表SC共同查询得到结果

- 更新视图

更新视图是指通过视图来插入、删除和修改数据

由于视图是不实际存储数据的虚表,因此对视图的更新最终要转换为对基本表的更新。所以为了防止用户对数据有意无意的操作,可在定义视图时加上 with check option 如例3

  • 例 6 将信息系学生视图IS_Student 好、中学号为200215122的学生姓名改为"张大屁"
<code><span><span>Update</span> IS_Student
<span>set</span> Sname=<span>'张大屁'
where Sno='2000215122';
</span></span></code>
Nach dem Login kopieren

转换后对应的语句为

<code><span><span>Update</span> Student
<span>set</span> Sname=<span>'张大屁'
where Sno='200215122' and Sdept='IS';
</span></span></code>
Nach dem Login kopieren
  • 例7 向信息系学生视图中插入一个新的学生记录 学号为200215129 姓名为 ‘李红’ 年龄为21
<code><span><span>insert</span> <span>into</span>
IS_Student
<span>values</span>(<span>'200215129'</span>,<span>'李红',21);
</span></span></code>
Nach dem Login kopieren

转换后的语句为

<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>
Nach dem Login kopieren
  • 例8 删除信息系学生学号为200215111的学生
<code><span><span>delete</span> 
<span>from</span> IS_Student
<span>where</span> Sno=<span>'200215111'</span>;</span>
</code>
Nach dem Login kopieren

转换后的语句为

<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>
Nach dem Login kopieren

视图更新的限制

如果视图定义中有如下子句则不能更新

  • 分组 使用group by 和 Having
  • 联结
  • 子查询
  • 并集
  • 聚集函数 MAX MIN COUNT AVG
  • DISTINCT
  • 导出列

- 视图的删除

视图删除格式为

<code><span><span>DROP</span> <span>VIEW</span>  [CASCADE] ;
</span></code>
Nach dem Login kopieren

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

  • 例9 删除视图IS_Student
<code><span><span>Drop</span> <span>VIEW</span> IS_Student;</span>
</code>
Nach dem Login kopieren

- 视图的优点

- 1简化用户操作

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

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

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

- 3安全性

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

视图的缺点

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

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

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage