A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 赵红萍 中级黑马   /  2012-10-27 19:05  /  1267 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

sql中为什么要用视图呢?什么情况下才用视图啊?视图比表有什么优点吗?

评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1 很给力!

查看全部评分

2 个回复

倒序浏览
当你的数据库装了几百万开外条数据时,使用视图查询的效率是表查询效率的2.5倍(好像是2.5倍,有点忘了),这时使用视图查询的效果是明显的。
回复 使用道具 举报
本帖最后由 吴愿涛 于 2012-10-27 20:36 编辑

使用视图大致有两个方面的原因。
1.封装查询
数据库虽然可以存储海量数据,但是在数据表设计上却不可能为每种关系创建数据表。例如,对于学生表,存储了学生信息,学生的属性包括学号、姓名、年龄、家庭地址等信息;而学生成绩表只存储了学生学号、科目、成绩等信息。现需获得学生姓名及成绩信息,那么就需要创建一个关系,该关系需要包含学生姓名、科目、成绩。但为该关系创建一个新的数据表,并利用实际信息进行填充,以备查询使用,是不适宜的。因为这种做法很明显的造成了数据库中数据的大量冗余。
视图则是解决该问题的最佳策略。因为视图可以存储查询定义(或者说关系运算),那么,一旦使用视图存储了查询定义,就如同存储了一个新的关系。用户可以直接对视图中所存储的关系进行各种操作,就如同面对的是真实的数据表。
2.灵活的控制安全性
一个数据表可能含有很多列。但是这些列的信息,对于不同角色的用户,可访问的权限有可能不同。例如,在员工表中,可能存在着员工工号、员工姓名、员工年龄、员工职位、员工家庭住址、员工社会关系等信息。对于普通用户(例如普通员工),有可能需要访问员工表,来查看某个工号的员工的姓名、职位等信息,而不允许查看家庭住址、社会关系等信息;对于高级用户(例如人事经理),则需要关注所有信息。那么,这就涉及数据表的安全性。
利用视图可以灵活地实现这一策略。例如,可以首先创建名为vw_employees的视图。该视图的查询定义为,选择员工表中员工工号、员工姓名、员工职位等3列。这相当于在员工关系中,进行投影运算,即选择员工工号、员工姓名、员工职位这3个属性,形成新的关系,如图11-2所示。
图11-2  利用投影运算获得普通用户使用的视图vw_employees
同样,对于高级用户,可以创建名为vw_employees_hr的视图,该视图选择员工表中所有列,如图11-3所示。
图11-3  利用投影运算获得HR用户使用的视图vw_employees_hr
然后,对于两种角色,分别分配两个视图的查询权限,与实际的数据表employees隔离开来,从而控制数据访问的安全性。
视图和表相比有安全灵活的有点。
经常用到的查询,或较复杂的联合查询应当创立视图,这是会优化性能的

还有就是涉及到权限管理方面,比如某表中的部分字段含有机密信息,不应当让低权限的用户访问到的情况,这时候给这些用户提供一个适合他们权限的视图,供他们阅读自己的数据就行了。
当一个查询逻辑复杂,且别的查询需要查询这个查询的结果时
用视图
还有就是敏感数据
1、的确的看你的需求了,处理比复杂的逻辑或多表的连接查询你最好用存储过程,这样可以提高你的服务器性能。
2、视图本身是一张虚拟表,处理表与表关系不太复杂操作时也可以用了。
3、触发器一般用在多表间级联操作更新或删除一个表中某个字段,那么相关其他表也一同更新或删除呀!

通过限制可由用户使用的数据,可以将视图作为安全机制。用户可以访问某些数据,进行查询和修改,但是表或数据库的其余部分是不可见的,也不能进行访问。无论在基础表(一个或多个)上的权限集合有多大,都必须授予、拒绝或废除访问视图中数据子集的权限。
由于查询和视图有如此多的相似性,所以很容易忽略它们之间的差异。本节对查询和视图做一个简单的比较。

存储   视图存储为数据库设计的一部分,而查询则不是。当设计数据库时,可以出于下列原因将视图包括在设计中:   
一些数据子集关系到许多用户。由于每个视图都存储在数据库内,所以视图建立特定的数据子集以供任何数据库用户使用。

视图可以隐藏基表。可以禁止所有用户访问数据库表,而要求用户只能通过视图操作数据。这种方法可以保护用户和应用程序不受某些数据库修改的影响。例如,如果可以创建一个名为 "本月销售额 "的视图。在每月的第一天,可以相应地修改视图的定义。如果没有这个视图,用户每月都必须重新编写查询以选择相应月份的销售额。   
更新结果   对视图和查询的结果集更新限制是不同的。有关更多信息,请参见结果更新规则。

排序结果   可以排序任何查询结果,但是只有当视图包括   TOP   子句时才能排序视图。有关   TOP   子句的更多信息,请参见使用   TOP   和   PERCENT   限制结果集。
生成查询计划   查询计划是内部策略,通过它数据库服务器尝试快速创建结果集。数据库服务器可以在保存视图后立即为视图建立查询计划。但是对于查询,数据库服务器直到查询实际运行时才能建立查询计划——也就是说,直到用户显式请求结果集时。
参数设置   可以为查询创建参数,但不能为视图创建参数。有关参数化查询的更多信息,请参见创建通用查询。
加密   可以加密视图,但不能加密查询。有关更多信息,请参见加密视图。




20120801030850416.jpg (13.86 KB, 下载次数: 35)

20120801030850416.jpg

20120801030849946.jpg (11.7 KB, 下载次数: 22)

20120801030849946.jpg

评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1 很给力!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马