文章目录
1.视图的定义
视图 : 属于数据库对象之一
表、视图、序列、索引、同义词、触发器
视图,是一个虚表。建立在表的基础之上
注意:可以建立在一张表,或多张表
视图(view),也称虚表, 不占用物理空间,这个也是相对概念,因为视图本身的定义语句还是要存储在数据字典里的。视图只有逻辑定义。每次使用的时候,只是重新执行SQL。
视图是从一个或多个实际表中获得的,这些表的数据存放在数据库中。那些用于产生视图的表叫做该视图的基表。一个视图也可以从另一个视图中产生。
视图的定义存在数据库中,与此定义相关的数据并没有再存一份于数据库中。通过视图看到的数据存放在基表中。
视图看上去非常象数据库的物理表,对它的操作同任何其它的表一样。当通过视图修改数据时,实际上是在改变基表中的数据;相反地,基表数据的改变也会自动反映在由基表产生的视图中。由于逻辑上的原因,有些Oracle视图可以修改对应的基表,有些则不能(仅仅能查询)。
还有一种视图:物化视图(MATERIALIZED VIEW ),也称实体化视图,快照 (8i 以前的说法) ,它是含有数据的,占用存储空间。
tips: 查询视图没有什么限制, 插入/更新/删除视图的操作会受到一定的限制; 所有针对视图的操作都会影响到视图的基表; 为了防止用户通过视图间接修改基表的数据, 可以将视图创建为只读视图(带上with read only选项)
2.视图的好处
1)提供各种数据表现形式, 可以使用各种不同的方式将基表的数据展现在用户面前, 以便符合用户的使用习惯(主要手段: 使用别名);
2)隐藏数据的逻辑复杂性并简化查询语句, 多表查询语句一般是比较复杂的, 而且用户需要了解表之间的关系, 否则容易写错; 如果基于这样的查询语句创建一个视图, 用户就可以直接对这个视图进行"简单查询"而获得结果. 这样就隐藏了数据的复杂性并简化了查询语句.这也是oracle提供各种"数据字典视图"的原因之一,all_constraints就是一个含有2个子查询并连接了9个表的视图(在catalog.sql中定义);
3)执行某些必须使用视图的查询. 某些查询必须借助视图的帮助才能完成. 比如, 有些查询需要连接一个分组统计后的表和另一表, 这时就可以先基于分组统计的结果创建一个视图, 然后在查询中连接这个视图和另一个表就可以了;
4)提供某些安全性保证. 视图提供了一种可以控制的方式, 即可以让不同的用户看见不同的列, 而不允许访问那些敏感的列, 这样就可以保证敏感数据不被用户看见;
5)简化用户权限的管理. 可以将视图的权限授予用户, 而不必将基表中某些列的权限授予用户, 这样就简化了用户权限的定义。
3.定义视图
某个用户在创建视图时,可能权限不足。需要授权。
过sys 授予scott 创建视图的权限。
撤销revoke create view from scott;
创建grant xxxx to scott(grant create any view to scott;)
create view 视图名
as
select ...语句
create view myempview
as
select d.deptno 部门编号,e.empno,e.ename,e.sal,e.comm ,d.dname from emp e ,dept d where e.deptno=d.deptno and d.deptno=20;
4.操作视图
操作视图: DML(增删改) +Query(查) 和表完全一致
尝试修改视图时:update myempview set ename = ‘hello’ where empno=7934 ;
报错:无法修改与非键值保存表对应的列
如果操作表因为是两张表生成的视图,会发生不知道操作那张表,所以尽量使用视图的时候,只是查询
4.1 with check option
create view 视图名
as
select 语句..
with check option ;
with check option :限制对视图操作时,必须满足where子句
drop view myempview ;
create view myempview
as
select empno ,ename ,deptno from emp where deptno =20 with check option;
4.2 with read only
视图只建议查看,不建议DML。因为对视图的操作,会影响原表。
create view myempview
as
select empno ,ename ,deptno from emp where deptno =20 with read only ;
4.3 在增删改view的时候,需要遵守的条件
①当视图中存在以下之一时,不能Insert/update
group by 、distinct、组函数、列的定义为表达式
②当视图中存在以下之一时, 不能delete
group by 、distinct、rownum伪劣
不建议对视图进行增删改
5. 简单视图与复杂视图
| 简单视图 | 复杂视图 | |
|---|---|---|
| 表的数量 | 1 | 1~n |
| 函数 | 没有 | 有 |
| 分组 | 没有 | 有 |
1394

被折叠的 条评论
为什么被折叠?



