Oracle视图

一、视图的概念

视图是基于一个或者多个表上的预定义查询,这些表称为基表,从视图中查询数据的方法与从基表中查询数据的方法相同。视图是一个查看数据的窗口,是查询语句模板,视图本身没有数据,在数据库中只保存了视图的定义。

视图具有以下优点:

1)可以向数据访问者只开放访问视图的权限,屏蔽基表信息。

2)可以将复杂的查询语句保存为视图,简化了SQL语句的编写。

3)创建视图的时候,可以限制只访问基表中的部分列或者部分行的数据,这样可以实现一定的安全性。

4)简化用户权限的管理,只授予用户使用视图的权限。

5)从基表中按一定的业务逻辑抽出用户关心的部分数据创建视图,简化了业务逻辑。

二、创建视图

语法:

create [or replace] [{force|noforce}] view 视图名
as
select查询语句
[with read only]

语法解析:

or replace:如果视图已经存在,则替换旧视图。

force:即使基表不存在,也可以创建该视图,但是该视图不能正常使用,当基表创建成功后,视图才能正常使用。

noforce:如果基表不存在,无法创建视图,该项是默认选项。

with read only:默认可以通过视图对基表执行增删改操作,with read only强调这是只读视图,不能通过该视图进行增删改操作。现实开发中,基本上不通过视图对表中的数据进行增删改操作。

示例一,在超女表中创建一个简单的视图V_GIRL,只提取编号、姓名、身材和颜值字段。

create or replace noforce view V_GIRL
as
select id,name,sc,yz from T_GIRL
with read only;

从V_GIRL视图中查询数据:

在这里插入图片描述

示例二,连接EMP表和DEPT表创建视图V_EMPDETAIL,隐藏了工资(sal)和备注(comm)字段。

create or replace view V_EMPDETAIL
as
select empno,ename,job,hiredate,EMP.deptno,dname
  from EMP join DEPT on EMP.deptno=DEPT.deptno
with read only;

从V_EMPDETAIL视图中查询数据:

在这里插入图片描述

三、视图的状态

当创建视图后,Oracle会验证视图的有效性,如修改了基本表,可能会导致视图的不可用,数据字典的USER_OBJECTS的status字段中记录了视图的状态(VALID-有效;INVALID-失效)。

在这里插入图片描述

我们来做一个测试。

1)删除T_GIRL表的name字段。

alter table T_GIRL drop column name;

2)执行一次查询视图,出现了错误。

在这里插入图片描述

3)查询视图的状态,成了INVALID。

在这里插入图片描述

4)在T_GIRL表中增加name字段。

alter table T_GIRL add name varchar2(30);

5)查询视图的状态,还是INVALID,数据结构已恢复,但视图的状态未恢复。

在这里插入图片描述

6)执行一次查询,视图已恢复正常。

在这里插入图片描述

7)再查询视图的状态,恢复成了VALID。

在这里插入图片描述

在上面的测试中,我们发现基表数据结构的改变导致了视图无效,数据结构恢复后,视图能自动恢复正常(中间有一点曲折)。

四、删除视图

语法:

drop view 视图名;

示例:

drop view V_GIRL;

五、视图的其它知识

视图还有两个方面的知识,大家可以了解一下:

1)本文只介绍了只读视图,对视图只会执行select操作,其实视图还可以进行增、删、改操作,但应用场景极少,二十年来,我从未见过。

2)本文介绍的视图是查询数据的窗口、是虚拟表、是SQL模板,视图本身没有数据,但是,有一种视图叫物化视图,是有数据的,但是,物化视图的应用也非常少。

六、版权声明

C语言技术网原创文章,转载请说明文章的来源、作者和原文的链接。
来源:C语言技术网(www.freecplus.net)
作者:码农有道

### 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]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值