oracle 视图

来源:互联网 发布:中兴手机在线升级软件 编辑:程序博客网 时间:2024/04/28 18:23

oracle视图分为四种视图

关系视图:关系视图并不存储真正的数据,因此占用数据库资源也较少。 一般大家使用的都是关系视图。

1.创建关系视图

create or replace view vw_employees as select employee_id, last_name || first_name as employee_name, province || '-' || city as location from employees

2.查看视图定义select text from user_views where view_name = 'VW_EMPLOYEES' 

3.查看视图内容select * from vw_employees

4.删除视图drop view vw_employees

5.重新编译视图

alter view vw_employee_salary compile

6.通过视图更新数据库数据:

通过视图,不但可以对基础表中的数据进行查询,而且可以对数据表中的数据进行更新。更新的方式非常简单——直接更新视图中的数据即可将对基础表进行相应的更新。当然,并非视图中的所有列都能够进行更新,并反映到基础表中。只有那些直接由基础表获得的列可以进行更新操作

7.创建的视图里面的表还没有被创建:

有时,视图的基础表还没有创建,但是仍然希望能够创建基于不存在的数据表的视图。这是因为,数据表的预期创建者和视图的创建者并非同一用户。视图创建者不希望等待基础表创建者的工作完成之后才进行自己的工作。假设,此时视图创建者已经对基础表的结构有了清晰的概念,例如books将被创建,以存储图书信息。create or replace force view vw_books asselect book_name, authorfrom books

8.with check option

创建视图时,with check option是常用的选项之一。一旦使用了该选项,那么Oracle将保证视图在数据更新之后与更新之前的结果集相同。

例如:

create or replace view vw_books asselect * from books where book_id = 5 update vw_books set book_id = 6create or replace view vw_books as select * from books where book_id = 5with check option 
这样的话,因为这个视图里面的where含有book_id 所以 当你根据这个视图去更新数据的时候 不能去更新book_id


内嵌视图:内嵌视图通俗的的说 其实相当于 自己在多表联合的时候起得别名,用过一次后就不再使用。

例如:

select * from (select employee_id, last_name || first_name employee_name, salary from employees order by salary desc) where rownum <= 3


对象视图:说道对象视图,我自己是很少使用的,其实也就是利用基础对象类型employee来创建对象视图,那么视图中的列将与employee_type中的属性保持一致。

首先先创建一个类似于java对象的数据对象表 也叫type表

create type employee is object (employee_id number, employee_name varchar2(20), location varchar2(50), salary number)

其中里面定义了各个字段的类型

然后开始创建视图:

create or replace view ov_employees of employee with object oid(employee_id) as select employee_id, last_name || first_name, province || city, salary from employees 


注意,oid的值employee_id指的是对象employee中的属性,并非基础表employees中的employee_id列。

也就是说如果基础数据表里面的mployee_id类型是varchar的 ,这里创建的type 中mployee_id的数据类型是number的 那么你创建的视图的id属性是number的 这就叫做对象视图。视图里面的属性是和创建的对象表里面的的类型一致的。


物化视图:

物化视图是物理化视图的简称,顾名思义,该视图存储实际数据,因此,会占用一定的数据库空间。在这一点上,更接近于临时表。但不像临时表那样在某个特定的时机会删除数据。物化视图中的数据是可重用的,因此,经常应用于读取频繁的场合。

通俗的理解就是,物化视图相当于一张表,是实际存在的。

物化视图对于大数据表的处理显得尤为重要。为了统计一个拥有百万级记录的数据表的总和及平均值问题,将耗费大量数据库资源和时间。可以通过物化视图改善这一状况。即,对表进行一次统计,并将统计结果存储在物化视图中,那么,以后的每次查询直接查询该视图即可。

创建物化视图:

1.创建物化视图create materialized view mv_monthly_salesbuild immediaterefresh on commitenable query rewriteas   select sale_month, sum(price*quantity)  from employee_sale_details  group by sale_month

在创建物化视图的SQL语句中使用了build immediate。该选项用于立即加载物化视图的数据。也就是说,在创建物化视图的同时,立即根据定义从基础表中获取数据,并将数据添加到物化视图中。

另外一个可用选项为build deffered,表示延迟载入数据。
使用延迟加载是必要的。有时,物化视图的基础表数据量巨大,载入数据会耗费大量资源。直接使用立即加载策略,在数据库使用高峰期,会造成客户端的延迟。但是,后续的开发工作可能使用到该物化视图,那么可以采用延迟加载数据的策略。
refresh on commit,要求Oracle实现自动更新的功能。即基础表的数据更新被提交后,应该自动更新物化视图的数据。
enable query rewrite选项。该选项用于启用查询重写。查询重写是指Oracle对基础表的查询,按照优化原则,查找恰当的物化视图,如果获得优化视图,则将查询转化为对物化视图的查询。


select object_name, object_type, status from user_objects where object_name='MV_MONTHLY_SALES'


数据库里面的user_object包含了所有的你所创建的表,视图,函数等等,可以用来查询。


原创粉丝点击