暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

View视图

Oracle微学堂 2019-06-03
552
1F
View视图

使用视图为了我们的方便

增加了数据库的负担

视图下降数据库的性能

视图是查询语句的别名

视图的定义存在于数据字典中

User_views查看视图的定义

视图是好东西,用好了提高开发的效率和安全性,反之数据库的性能极大的下降,数据库是给明白人用的。物有所长,必有所短,万物一理,视图也不例外。Oracle的所有字典都是视图。极大的提高了管理性,极大的提高了可使用性,我们学习oracle,就要跟oracle学习,他怎么玩,我们就怎么玩

2F
使用视图的目的

限制对数据库的访问

将复杂的查询包起来,化繁为简

提供给用户独立的数据

在同一个表上建立不同的视图,减少基表的个数。

3F
建立和使用视图

如果没有权限,请先授权。在10G以前SCOTT用户是有create view的权限的,10g以后就没有了。

因为默认的角色的权限发生了变化。

Conn as sysdba

Grant create view to scott;

Conn scott/tiger

create view v1

as select deptno,min(sal) salary from emp group by deptno;

SQL> Desc v1;

Name Null? Type

----------------------------------------------------- -------- ---------

DEPTNO NUMBER(2)

SALARY NUMBER

其中salary 是min(sal)的别名,因为函数不能作为列的名称,列的别名的本质用法,将非法的合法化。

SQL> Select * from v1;

DEPTNO SALARY

------ ----------

30 950

20 800

10 1300

视图v1只是一个定义,没有独立的数据,数据还是存放在emp表中。

SQL> Select VIEW_NAME, text from user_views;

查看视图的定义

VIEW_NAME TEXT

------------------------------ -------------------------------------------------------

V1 select deptno,min(sal) salary from emp group by deptno

4F
视图的使用

你使用视图的时候可以把视图当做表

数据库在解释查询语句的时候会查找视图的定义

视图中不存放数据,除了物化视图,物化视图是快照,真正的存放数据,需要刷新。

每次查询的时候都要进行数据的查找

5F
视图的执行过程

Select * from v1;

查找user_views取出v1视图的定义。

select deptno,min(sal) salary from emp group by deptno;

数据库执行查找到的定义

所以说视图下降数据库的性能,尤其在复杂的视图相互关联查询的时候,你觉得语法很简单,其实视图

内调用了大量的表,容易使我们麻痹大意。

Force强制建立视图,视图使存在于数据字典中的定义,那么就可以先存在定义,再有基表。

先存在视图的定义,再建立基本表得使用强制的语法。

Drop table t2 purge;

Create force view v2 as select * from t2;

Create table t2 as select * from emp;

查看状态为INVALID

select object_name,object_type,status from user_objects;

调用视图后再查看状态为VALID

Select * from v2;

select object_name,object_type,status from user_objects;


修改视图

Create or replace view v1 as select * from dept;

就是将视图的定义替换。


删除视图

Drop view v1;

在数据字典中将视图的定义清除

不影响基本表中的数据

视图上运行DML

简单的视图可以运行dml


等于直接操作基本表的数据

但受到一些限制

Delete的限制

1.有组函数

2.有group by 子句

3.用了distinct关键字

4.有rownum列

Delete v1 where deptno=10;

ORA-01732: 此视图的数据操纵操作非法


Update的限制

1.有组函数

2.有group by 子句

3.用了distinct关键字

4.有rownum列

5.有表达式的列


insert的限制

1.有组函数

2.有group by 子句

3.用了distinct关键字

4.有rownum列

5.有表达式的列

6.基本表中有not null的列,但该列没有出现在视图的定义里


WITH CHECK OPTION选项

CREATE OR REPLACE VIEW empvu20

AS SELECT *

FROM emp

WHERE deptno = 20

WITH CHECK OPTION CONSTRAINT empvu20_ck ;

建立视图的时候带有检测约束,约束就是where的条件。确保在update视图的时候,视图所选择的行不会发生变化,是对视图中数据的一种保障。

update empvu20 set deptno=10;

ORA-01402: 视图 WITH CHECK OPTIDN where 子句违规


Read only 选项

CREATE OR REPLACE VIEW empvu10

(employee_number, employee_name, job_title)

AS SELECT empno, ename, job

FROM emp

WHERE deptno = 10

WITH READ ONLY;


inline内嵌式视图

将from 子句中的子查询起别名

select ename,sal from

emp,

(select deptno,avg(sal) salary from emp group by deptno) a

where emp.deptno=a.deptno

and emp.sal>a.salary;

A就是内嵌式视图

当前语句内起作用

一次性的,在语句外不可引用

Top-n查询

SELECT ROWNUM as RANK, ename, sal

FROM (SELECT ename,sal FROM emp

ORDER BY sal DESC)

WHERE ROWNUM <= 3;

From 子句后为视图,内嵌式。

扫描二维码关注我的微学堂

搜索刘老师微信号:Rman-2014,备注“Oracle学习与咨询”,即可添加好友;或者扫描下面二维码,关注我的“微学堂”公众号,了解最新OCP认证动态、题库及答案解析、培训机构及讲师介绍、课堂授课内容等。每天还有一篇技术文章发布哦!



最后修改时间:2019-12-20 16:17:32
文章转载自Oracle微学堂,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论