oracle 视图


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 as
select * from books 
where book_id = 5 

update vw_books set book_id = 6

create or replace view vw_books as 
select * from books 
where book_id = 5
with 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_sales
build immediate
refresh on commit
enable query rewrite
as   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包含了所有的你所创建的表,视图,函数等等,可以用来查询。


### Oracle 视图使用教程 #### 创建视图Oracle 数据库中,视图是一种虚拟表,其内容由查询定义。创建视图允许用户以一种简化的方式访问复杂查询的结果集。通过 `CREATE VIEW` 或者更常用的 `CREATE OR REPLACE VIEW` 语句来实现这一点[^2]。 例如,要建立一个仅包含特定部门所有员工信息的视图: ```sql CREATE OR REPLACE VIEW dept_20_staff AS SELECT * FROM employees WHERE department_id = 20; ``` 这条命令会创建名为 `dept_20_staff` 的新视图,该视图将展示来自 `employees` 表里属于第20号部门的所有记录。 #### 设置只读属性 为了防止对某些重要数据进行意外更改,可以通过指定 `WITH READ ONLY` 来使视图为只读模式: ```sql CREATE OR REPLACE VIEW sensitive_data_view AS SELECT column1, column2 FROM base_table WITH READ ONLY; ``` 这确保了即使有人尝试更新或插入到这个视图中的任何行,操作也会失败并返回错误消息[^3]。 #### 修改现有视图 当需要调整已有视图的内容而不想先删除再重建时,则可利用 `OR REPLACE` 关键字来进行平滑过渡。这种方式不会影响正在使用的应用程序连接状态或者依赖于旧版本视图的对象。 #### 删除不再需要的视图 如果某个视图已经过时或是不再被应用所必需,那么应当考虑将其移除以保持数据库整洁有序。执行如下SQL即可完成这项工作: ```sql DROP VIEW view_name CASCADE CONSTRAINTS; ``` 这里加上选项 `CASCADE CONSTRAINTS` 是为了避免因存在外键约束而导致无法成功删除的情况发生。 #### 视图的优点与局限性 - **优点**: 提供了一种抽象层面上的数据表示方法;有助于保护底层真实表格结构免受外部干扰;能够隐藏不必要的细节给最终用户提供更加友好的接口形式。 - **缺点**: 查询性能可能不如直接针对物理表那样高效;维护成本较高因为每次变更基础表都需要同步更新相应的视图逻辑[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值