这次我们一起聊聊课堂上的oracle数据库有关视图的事

视图

视图是从一个或多个表或视图中提取出来的数据的一种表现形式,它并不存储真实的数据,不占用实际的存储空间,只是在数据字典中保存它的定义信息,因此视图被认为是–存储的查询–,或–虚拟的表–。

实际上,视图只包含映射到基表的一组SQL语句。本处的基表,既可以是真正的表,也可以是视图。

为什么要使用视图?

原因:一方面可以简化查询所使用的语句;另一方面可以起到安全和保密的作用。

由于视图是基于表而创建的,因此视图与表有许多相似之处,用户可以像使用表一样,对视图进行创建、查询、修改和删除等操作。

其最大特点是可以像普通表一样从视图中查询数据。

3.1 创建视图

用户要在自己的模式下创建视图。

如具有create any view权限,可以在其他用户的模式下创建视图。

如果一个视图的基表是其他用户模式中的对象,那么当前用户需要具有对这个基表的select权限。

创建视图的语法格式:

create [or replace] [force | noforce] VIEW [schema.]view_name
[alias_name[,……]]
as select ……
[with {check option |read only} constraint constraint_name];

语法说明:

(1)or replace: 如果视图已经存在,则替换现有视图。

(2)force |noforce: force表示即使基表不存在,也要创建视图;noforce表示如果基表不存在,则不创建视图,此为默认选项。

(3)view_name: 创建的视图名称。与表和字段的命名规则相同。

(4)alias_name: 子查询中字段(或表达式)的别名。别名的个数与子查询中字段的个数必须一致。

(5)select语句:子查询语句,可以基于一个或多个表或视图。

(6)check option:除了可以对视图执行select子查询以外,还可以对视图进行DML操作(插入、修改、删除),实际上就是对基表的修改操作。默认情况下,可以通过视图对基表中的所有数据进行DML操作,包括视图的子查询无法检索的数据。如果使用with check option选项,则表示只能对视图中子查询能够检索到的数据进行DML操作。

(7)read only:表示只能通过视图读取基表中的数据,而不能进行DML操作。

(8)constraint constraint_name:为with check option或with read only约束定义约束名称。

1.创建简单视图

基于单个表,而且不对子查询检索的字段进行函数或者数学计算的视图。

例1:在scott用户下创建基于职工表emp的视图emp_view1。要求:该视图的子查询检索职工表emp中职工所在部门编号deptno为30的职工的编号empno,姓名ename和工资sal等信息。

alter user scott account unlock;
alter user scott identified by tiger;
grant create view to scott;
--以上为解锁scott账号,并给其授权create view权限。
create view emp_view1
as
select empno,ename,sal
from emp where deptno =30;
--查询新建视图
select * from emp_view1;
2.创建复杂视图

复杂视图,指的是基于多个表,或者对子查询检索的字段进行函数或者数学计算的视图或者对基表进行了distinct查询。

例2:在Scott用户下创建基于职工表emp的视图emp_view2,并且对子查询中的检索的字段sal进行数据计算,查询工资上调15%以后工资大于2000的职工编号empno、职工姓名ename和上调后的职工工资new_sal。

create view emp_view2
as
select empno,ename,sal*1.15 new_sal
from emp where sal*1.15 > 2000;

说明:如果对字段进行了函数或者科学计算,则必须为该字段定义别名。别名的定义既可以在视图名称后面定义,也可以在子查询中定义。

例3:在scott用户下创建基于职工表emp和部门表dept的视图emp_view3,在该视图的子查询中检索职工编号empno、姓名ename、工资sal和所在部门名称dname。

create view emp_view3
as
select empno,ename,sal,dname
from emp,dept
where emp.deptno=dept.deptno;
3.2 视图的DML操作

视图的DML操作是指对视图中的字段进行插入insert、修改update和删除delete等操作。

对视图进行的DML操作,实际上就是对视图的基表中的字段执行DML操作。

一般来说,简单视图的所有字段都支持DML操作,但对于复杂视图来说,如果该字段进行了函数或者数学计算,或者在表的连接子查询中该字段不属于主表中的字段,则该字段不支持DML操作。

说明:在多表的连接子查询中,from子句中指定的第一个表属于主表。例3中的from语句指定的第一个表emp就是主表。

例4:查看以创建的视图emp_view2中的字段是否支持DML操作。

select column_name,insertable,updatable,deletable
from user_updatable_columns
where table_name =upper('emp_view2');

这次我们一起聊聊课堂上的oracle数据库有关视图的事_第1张图片

new_sal字段是对基表emp中sal字段执行的数学计算,不支持DML操作。

可以对视图中支持DML操作的所有字段执行DML操作,操作结果会直接反映到基表中。

例5:使用insert语句,向已创建视图emp_view2中支持DML操作的字段插入记录(7459,‘ERIC’,‘CLERK’,20),试试是否成功。

insert into emp_view2(empno,ename,job,deptno) avlues(7459,'Eric','Cleak',20);
--减少视图中不存在的可DML操作的字段,再次插入记录
insert into emp_view2(empno,ename) avlues(7459,'Eric');
--查看基表数据是否插入成功。
select * from emp where empno='7459';

说明:插入的记录有数据,其他的为默认值,如果没有设置默认值,则为null,如果该字段设有NOT NULL约束,则该条记录将无法成功执行。

3.3 修改和删除视图

修改视图可直接使用create or replace view语句来完成。

删除视图可使用drop view语句。

例6:删除emp_view1视图。

drop view emp_view1;

你可能感兴趣的:(Oracle)