视图是一个虚拟表,它由存储的查询构成,可以将它的输出视为一个表。视图同真实表一样,也可以包含一系列带有名称的列和行数据。但是,视图并不在数据库中存储数据值,其数据值来自定义视图的查询语句所引用的表,数据库只在数据字典中存储视图的定义信息。
视图既可以建立在关系表上,也可以建立在其他视图上,或者同时建立在二者之上。视图看上去非常像数据库中的表,甚至可以在视图中进行INSERT、UPDATE和DELETE操作。通过视图修改数据时,实际上就是在修改基本表中的数据。与之相对应,改变基本表中的数据也会反映到由该表组成的视图中。
1. 创建视图
创建视图是使用CREATE VIEW语句完成的。为了在当前用户模式中创建视图,要求数据库用户必须具有CREATE VIEW系统权限;如果要在其他用户模式中创建视图,则用户必须具有CREATE ANY VIEW系统权限。创建视图最基本的语法如下:
CREATE [OR REPLACE] VIEW <view_name> [(alias[,alias]…) ] AS <subquery>
[WITH CHECK option] [CONSTRAINT constraint_name]
[WITH READ ONLY]
alias:用于指定视图列的别名。 subquery:用于指定视图对应的子查询语句。 WITH CHECK option:该子句用于指定在视图上定义的CHECK约束。 WITH READ ONLY:该子句用于定义只读视图。
在创建视图时,如果不提供视图列别名,Oracle会自动使用子查询的列名或列别名;如果视图子查询包含函数或表达式,则必须定义列别名。
1.1. 创建简单视图
简单视图是指基于单个表建立的,不包含任何函数、表达式和分组数据的视图。
--创建一个查询部门编号为20的记录的视图
create or replace view emp_view as
select empno,ename,job,deptno from emp
where deptno=20;
--通过SELECT语句查询视图emp_view
select * from emp_view;

对于简单视图而言,不仅可以执行SELECT操作,还可以执行INSERT、UPDATE、DELETE等操作。
首先向视图emp_view中插入一条记录,然后修改这条记录的ename字段值,接着查询emp_view视图中的信息,最后删除该记录并提交到数据库,代码如下:
--向视图emp_view插入一条记录
insert into emp_view values (6666,'南方','MANAGER',20);
--修改emp_view视图刚刚插入的这条记录
update emp_view set ename='北方' where empno=6666;
--删除emp_view视图中empno=6666的记录
delete from emp_view where empno=6666;

系统在执行CREATE VIEW语句创建视图时,只是将视图的定义信息存入数据字典中,并不会执行其中的SELECT语句。在对视图进行查询时,系统才会根据视图的定义从基本表中获取数据。由于SELECT是使用最广泛、最灵活的语句之一,通过它可以构造一些复杂的查询,从而构造一个复杂的视图。
1.2. 创建只读视图
建立视图时可以指定WITH READ ONLY选项,该选项用于定义只读视图。定义了只读视图后,数据库用户只能在该视图上执行SELECT语句,而禁止执行INSERT、UPDATE和DELETE语句。
在scott模式下,创建一个只读视图,要求该视图可以获得部门编号不等于88的其他所有部门信息,代码如下:
create or replace view emp_view_readonly as
select * from dept
where deptno != 88
with read only;
只能在该视图上执行SELECT操作,而禁止任何DML操作,否则Oracle将提示错误信息,通过只读视图emp_view_readonly修改所有部门的位置为“长春”,代码如下:
update emp_view_readonly set loc='北京';

1.3. 创建复杂视图
复杂视图是指包含函数、表达式或分组数据的视图。使用复杂视图的主要目的是简化查询操作。需要注意的是,当视图子查询包含函数或表达式时,必须为其定义列别名。复杂视图主要用于执行查询操作。
在scott模式下,创建一个视图,要求能够查询每个部门的工资情况,代码如下:
create or replace view emp_view_complex as
select deptno 部门编号,max(sal) 最高工资,min(sal) 最低工资,avg(sal) 平均工资
from emp
group by deptno;
1.4. 连接视图
连接视图是指基于多张表所建立的视图。使用连接视图是为了简化连接查询。需要注意的是,建立连接视图时,必须使用WHERE子句指定有效的连接条件,否则结果就是毫无意义的笛卡儿积。
在scott模式下,创建一个dept表与emp表相互关联的视图,并要求该视图只能查询部门编号为20的记录信息,代码如下:
create or replace view emp_view_union as
select d.dname,d.loc,e.empno,e.ename
from emp e,dept d
where e.deptno = d.deptno and d.deptno = 20;
2. 管理视图
在创建视图后,还可以对视图进行管理,主要包括查看视图定义、修改视图定义、重新编译视图和删除视图等。
2.1. 查看视图定义
数据库并不存储视图中的数值,而是存储视图的定义信息。用户可以通过查询数据字典视图user_views,以获得视图的定义信息。
SQL * Plus中使用DESC命令查看user_views数据字典的结构,代码如下:
desc user_views;

在user_views数据字典中,TEXT_VC列存储了用户视图的定义信息,即构成视图的SELECT语句。通过数据字典user_views查看视图emp_view_union的定义,代码如下:
select text_vc from user_views where view_name = upper('emp_view_union');

2.2. 修改视图定义
建立视图后,如果要改变视图所对应的子查询语句,则可以执行CREATE OR REPLACE VIEW语句。
修改视图emp_view_union,使该视图实现查询部门编号为30的记录的功能(原查询信息是部门编号为20的记录),代码如下:
create or replace view emp_view_union as
select d.dname,d.loc,e.empno,e.ename
from emp e,dept d
where e.deptno = d.deptno and d.deptno = 30;
在上面的代码中,起到至关重要作用的关键字是REPLACE,它表示使用新的视图定义替换旧的视图定义。
2.3. 重新编译视图
视图被创建后,如果修改了视图所依赖的基本表定义,则该视图会被标记为无效状态。当访问视图时,Oracle会自动重新编译视图。除此之外,也可以使用ALTER VIEW语句手动编译视图。
--通过手动方式重新编译视图emp_view_union
alter view emp_view_union compile;
2.4. 删除视图
当不再需要视图时,用户可以执行DROP VIEW语句删除视图。用户可以直接删除其自身模式中的视图,但如果要删除其他用户模式中的视图,则要求该用户必须具有DROP ANY VIEW系统权限。
--删除视图emp_view_union
drop view emp_view_union;
执行DROP VIEW语句后,视图的定义将被删除,这对视图内所有的数据没有任何影响,它们仍然存储在基本表中。
3. 同义词对象
同义词是表、索引、视图等模式对象的一个别名。通过模式对象创建同义词,可以隐藏对象的实际名称和所有者信息,或者隐藏分布式数据库中远程对象的设置信息,由此为对象提供一定的安全性。与视图、序列一样,同义词只在Oracle数据库的数据字典中保存其定义描述,因此同义词也不占用任何实际的存储空间。
在开发数据库应用程序时,应该尽量避免直接引用表、视图或其他数据库对象的名称,而改用这些对象的同义词。这样可以避免当管理员对数据库对象做出修改和变动之后,必须重新编译应用程序。使用同义词后,即使引用的对象发生变化,也只需要在数据库中对同义词进行修改,而不必对应用程序做任何改动。
Oracle中的同义词分为两种类型,即公有同义词和私有同义词。公有同义词被一个特殊的用户组public所拥有,数据库中的所有用户都可以使用公有同义词;而私有同义词只被创建它的用户所拥有,只能由该用户以及被授权的其他用户使用。
建立公有同义词是使用CREATE PUBLIC SYNONYM语句完成的。如果数据库用户要建立公有同义词,则要求该用户必须具有CREATE PUBLIC SYNONYM系统权限。
在system模式下,为scott模式下的dept表创建一个public同义词,代码如下:
create public synonym public_dept for scott.dept;
执行上述语句,将建立公有同义词public_dept。因为该同义词属于public用户组,所以所有用户都可以直接引用该同义词。需要注意的是,如果用户要使用该同义词,则必须具有访问scott.dept表的权限。
--使用SELECT语句并通过同义词public_dept来访问dept表
select * from public_dept;
使用SELECT语句通过同义词public_dept访问dept表时,用户必须有访问scott.dept表的权限。

建立私有同义词是使用CREATE SYNONYM语句完成的。如果在当前模式中创建私有同义词,那么数据库用户必须具有CREATE SYNONYM系统权限;如果要在其他模式中创建私有同义词,那么数据库用户必须具有CREATE ANY SYNONYM系统权限。
--为dept表创建私有同义词private_dept
create synonym private_dept for dept;
私有同义词只有当前用户可以直接引用,其他用户在引用时必须带模式名。
当基础对象的名称和位置被修改后,需要重新为它建立同义词。用户可以删除自己模式中的私有同义词。当需要删除其他模式中的私有同义词时,用户必须具有DROP ANY SYNONYM系统权限;当需要删除公有同义词时,用户必须具有DROP PUBLIC SYNONYM系统权限。删除同义词需要使用DROP SYNONYM语句,如果要删除公有同义词,则还需要指定PUBLIC关键字。
--使用DROP SYNONYM语句删除私有同义词private_dept
drop synonym private_dept;
--使用DROP PUBLIC SYNONYM语句删除公有同义词public_dept
drop public synonym public_dept;
删除同义词后,同义词的基础对象不会受到任何影响,但是所有引用该同义词的对象将处于INVALID状态。
今天的文章就到这里,如果对你有用,记得点个【赞】和【在看】,感谢阅读~




