【数据库扫盲】视图

转自:http://blog.csdn.net/sj120418/article/details/7884391

最近在做一个功能,是和别的项目组一起合作的。

背景:现在要做一个用户管理的系统,需要我们提供服务来实现和原始数据库的兼容,但是现在我们的数据库和网站数据库中存储的内容或者说是字段有些不同,但是我们还是希望可以的话,将改动降低到最小,当然,这只是我的初步了解,现在具体的情况还没有很了解,为了这方面的应用,上网了解了一下数据库的相关操作,了解到“视图”是个比较有利的武器可以解决这个问题。

视图是从一个或几个基本表(或视图)导出的表。它与基本表不同,是一个虚表。数据库只存放视图的定义,而不存放视图对应的数据,这些数据仍存放在原来的基本表中。所以基本表中的数据发生变化,从视图中查询出的数据也就随之改变了。从这个意义上讲,视图就像一个窗口,透过它可以看到数据库中自己感兴趣的数据及其变化。
视图使用的时候跟表一样。主要作用是不让所有的人都能看到整张表。比如有个员工信息表,里面有联系方式,薪资等,可能只希望HR能看到薪资,其他人只能看到联系方式,那么就可以使用视图来实现。
既然视图的定义是基于基本表的,那为什么还要定义视图呢?这是因为合理地使用视图能够带来许多好处:
1、单源表视图
   视图的数据可以只取自一个基本表的部分行、列,这样的视图行列与基本表行列对应。这样定义的视图一般可以进行查询和更改数据操作。
2、多源表视图
   视图的数据可以来自多个表中,这样定义的视图一般只用于查询,不用于修改数据。
3、在已有视图上定义的新视图
   可以在视图上再建立视图,这时作为数据源的视图必须是已经建立好的。
4、带表达式的视图
   在定义基本表时,为减少数据库中的冗余数据,表中只存放基本数据,由基本数据经过各种计算派生出的数据一般是不存储的。但由于视图中的数据并不实际存储,所以定义视图时可以根据需要设置一些派生属性列,在这些派生属性列中保存经过计算的值。这些派生属性由于在基本表中并不实际存在,因此,也称它们为虚拟列。包含虚拟列的视图也称为带表达式的视图。
5、含分组统计信息的视图
   含分组统计信息的视图是指定义视图的查询语句中含有GROUP BY子句,这样的视图只能用于查询,不能用于修改数据。

数据的物理独立性是指用户的应用程序不依赖于数据库的物理结构。数据的逻辑独立性是指当数据库重构造时,如增加新的关系或对原有的关系增加新的字段,用户的应用程序不会受影响。层次数据库和网状数据库一般能较好地支持数据的物理独立性,而对于逻辑独立性则不能完全的支持。
在相关许数据库中,数据库的重构造往往是不可避免的。重构数据库最常见的是将一个基本表“垂直”地分成多个基本表。例如:将学生关系Student(Sno,Sname,Ssex,Sage,Sdept),分为SX(Sno,Sname,Sage)和SY(Sno,Ssex,Sdept)两个关系。这时原表Student为SX表和SY表自然连接的结果。如果建立一个视图Student:
CREATE VIEW Student(Sno,Sname,Ssex,Sage,Sdept)
AS
SELECT SX.Sno,SX.Sname,SY.Ssex,SX.Sage,SY.Sdept
FROM SX,SY
WHERE SX.Sno=SY.Sno;
这样尽管数据库的逻辑结构改变了(变为SX和SY两个表了),但应用程序不必修改,因为新建立的视图定义为用户原来的关系,使用户的外模式保持不变,用户的应用程序通过视图仍然能够查找数据。
当然,视图只能在一定程度上提供数据的逻辑独立,比如由于视图的更新是有条件的,因此应用程序中修改数据的语句可能仍会因为基本表构造的改变而改变。

 

转自:http://tech.it168.com/db/s/2006-07-21/200607211336796.shtml

数据库视图介绍(一)

  什么是视图:

  视图(view):从一个或几个基本表中根据用户需要而做成一个虚表

  1:视图是虚表,它在存储时只存储视图的定义,而没有存储对应的数据

  2:视图只在刚刚打开的一瞬间,通过定义从基表中搜集数据,并展现给用户

  视图与查询的区别:

  视图和查询都是用由sql语句组成,这是他们相同的地方,但是视图和查询有着本质区别:

  它们的区别在于:

  1:存储上的区别:视图存储为数据库设计的一部分,而查询则不是.

  2:更新限制的要求不一样

  要注意:因为视图来自于表,所以通过视图可以间接对表进行更新,我们也可以通过update语句对表进行更新,但是对视图和查询更新限制是不同的,以下我们会知道虽然通过视图可以间接更新表但是有很多限制.

  3:排序结果:通过sql语句,可以对一个表进行排序,而视图则不行。比如:创建一个含有order by子句的视图,看一下可以成功吗?

  视图的优点: 

  为什么有了表还要引入视图呢?这是因为视图具有以下几个优点:

  1:能分割数据,简化观点。可以通过select和where来定义视图,从而可以分割数据基表中某些对于用户不关心的数据,使用户把注意力集中到所关心的数据列.进一步简化浏览数据工作

  2:为数据提供一定的逻辑独立性。 如果为某一个基表定义一个视图,即使以后基本表的内容的发生改变了也不会影响“视图定义”所得到的数据

  3:提供自动的安全保护功能。 视图能像基本表一样授予或撤消访问许可权

  4:视图可以间接对表进行更新,因此视图的更新就是表的更新

  视图的创建和管理

  视图的创建

  1:通过sql语句

  格式:create view 视图名 as select 语句

   试一试:分别创建关于一个表或多个表的视图[因为视图可以来自于多表]

  2:通过企业管理器  

   说明:

  1:在完成视图的创立之后,就可以像使用基本表一样来使用视图

  2:在创建视图时,并非所有的select子查询都可用,如:compute和compute by,order by[除非与top一起连用] 

  3:但在查询时,依然都可以用在创建时禁用的select子查询

  4:在视图创建时,必须为没有标题列指定标题[思考:能否不用select语句来创建一个视图]
 
  视图的删除:

  1:通过sql语句:drop view 视图名

  2:通过企业管理器

  说明:与删除表不同的是,删除视图后只是删除了视图了定义,并没有删除表中的数据.[查看相关性]
 
  修改视图的定义

  1:通过企业管理器

  2:通过sql语句:

  格式:alter view 视图名 as 新的select语句

  浏览视图信息 sp_helptext 视图名 [查看视图创建的语句]

  如何通过视图修改基本表的数据.

  A:在视图上使用insert语句

  通过视图插入数据与直接在表中插入数据一样,但视图毕竟不是基本表.因此在进行数据插入时还是有一定的限制

  1:如果视图上没有包括基本表中属性为not null[不能为空]的列,那么插入操作会因为那些列是null值而失败.

  2:如果某些列因为某些规则或约束的限制而不能直接接受从视图插入的列时,插入会失败

  3:如果在视图中包含了使用统计函数的结果,或是包含计算列,则插入操作会失败

  4:不能在使用了distinct语句的视图中插入值

  5:不能在使用了group by语句的视图中插入值

数据库视图介绍(二)

  B:使用update更新视图中的数据

  1:更新视图与更新表格一样,但是在视图中使用了多个基本表连接的情况下,每次更新操作只能更新来自基本表的一个数据列

  例如:创建以下视图:

  
  
create view del as select 职工号,姓名,部门名称,负责人 from work1,部门 where work1.部门编号 = 部门.部门编号

  如果再执行下面的语句时:

  
  
update del set 职工号 = \ ' 001\',部门名称=\'wenda\' where 职工号 = \ ' 01\'[出现错误]

  只能够改成:

  
  
update del set 职工号 = \ ' 001\' where 职工号=\'01\' update del set 部门名称 = \ ' wenda\' where 职工号=\'01\'

  2:不能在使用了distinct语句的视图中更新值

  3:不能在使用了group by语句的视图中更新值
 
  C:使用delete删除视图中数据.

  通过视图删除数据最终体现为从基本表中删除数据

  格式:delete 视图名 [where 条件]

  说明:当视图由两个以上的基表构成时,不允许删除视图的数据

  例如:建一个视图kk

  
  
create view kk as select 职工号,姓名,性别,部门名称 from work1,部门 where work1.部门编号 = 部门.部门编号 [试着去删除]

  使用with check option的视图

  如果不了解视图定义内容,则常常会发生向视图中输入不符合视图定义的数据的情况.

  比如:

  
  
create view xm as select * from work where 性别 = \ ' 男\'

  完全可以插入insert xm values(\'001\',\'女\',23,\'2400\'....)

  尽管从意义上来说是不合理的,但是上述语句是正确的.为了防止这种情况的发生,可以使用with check option子句来对插入的或更改的数据进行限制.

  比如:

  
  
create view xm as select * from work where 性别 = \ ' 男\' with check option

  使用schemabinding的视图[使用绑定到构架]

  我们知道视图是依赖于表,如果在一个表中创建一个视图,今后如果这个表被删除了,则这个视图将不可再用了.为了防止用户删除一个有视图在引用的表,可以在创建视图的时候加上schemabinding关键字.

  比如:

  
  
create view 基本工资 with SCHEMABINDING as select 姓名,性别,基本工资 from dbo.work

  说明:

  1:不能使用“*”来创建此类型的视图

  2:创建此类型的视图时,一定要加上dbo.表名.

  3:如果在某个表中定义了此类视图,则用户将不能对表的结构进行修改,否则会删除这些绑定

  4:如果用户对表的结构进行列改名,则会删除绑定而且视图不可用.

  5:如果用户对表的结构进行列的类型或者大小修改,则会删除绑定但视图可用,此时用户可以删除视图所引用的表.
  
  使用with encryption对视图进行加密

  为了保护创建视图定义的原代码,可以对视图进行加密.

  比如:

  
  
create view kk with encryption as select * from work where 职称 = \ ' 经理\'

  用sp_helptext来查看一下.或用企业管理器查看一下.

  说明:如果应用此项用户将无法设计视图

  使用视图加强数据的安全

  一般通过使用视图共有三种途径加强数据的安全性

  A:对不同用户授予不同的使用权.

  B:通过使用select子句限制用户对某些底层基表的列的访问

  C:通过使用where子句限制用户对某些底层基表的行的访问, 对不同用户授予不同的权限

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值