上一篇👉:Oracle-----定义序列&定义特殊序列)


总目录👉震惊!史上最菜的Oracle 11g教程(大佬勿进)


🚴大家好!我是近视的脚踏实地,这篇文章主要是来学习视图的创建与使用操作以及视图的更新操作
     唯有行动  才能解除你所有的不安

1、视图的创建与使用

在所有进行的SQL语句之中,查询是最复杂的操作,而且查询还和具体的开发要求有关,那么在开发过程之中,程序员完成的并不是是和数据库的所有内容,而更多的是应该考虑到程序的设计结构。可以没有一个项目里边不会包含有复杂查询,那么程序员如何从复杂查询中解脱出来呢?

所以在这种情况下就提出了视图的概念。利用视图可以实现复杂SQL语句封装操作。从实际开发来讲,一个优秀的数据库设计人员,除了要给出合理的数据表结构之外,还应该将所有可能使用到的查询封装好视图,一并交给开发者。

视图依然属于DDL的范畴,所以视图的创建需要使用如下语法完成:

     create [or replace] view 视图名称 as 子查询

1.1 范例1:创建视图

范例1: 创建视图,下面这条语句的作用就是希望将10部门的所有雇员信息保存在视图之中

create view myview as select * from emp where deptno=10;

在这里插入图片描述
可以看到报了权限不足的错误,在Orcale 10g及之前的版本,scott用户是可以直接进行视图创建的,但是从Oracle 10g r2版本开始,如果想要创建视图,那么就需要单独分配创建视图的权限。

1.2 范例2:为scott分配创建视图的权限

范例2: 为scott分配创建视图的权限
在这里插入图片描述
权限分配完成之后则可以进行视图的创建操作。

create view myview as select * from emp where deptno=10;

在这里插入图片描述
视图本身属于数据库对象,所以要想查看视图的信息可以使用user_views数据字典完成。

select * from user_views;

在这里插入图片描述
在这个数据字典里边可以查询到视图具体的语法,视图可以像普通的数据表那样直接进行查询。

1.3 范例3:查询视图

范例3: 查询视图

select * from myview;

在这里插入图片描述
发现查询视图与之前直接使用select查询结果是完全相同的,所以视图就包装了SQL语句,而开发者可以通过视图简单地查询到所需要的数据。

于是下面可以继续利用视图包装一个复杂的SQL。

drop view myview;
create view myview
    as
select d.deptno,d.dname,d.loc,temp.count
from dept d,(select deptno,count(*) count
             from emp
             group by deptno) temp
where d.deptno=temp.deptno(+);

由于myview视图名称已经被占用了,所以理论上应该先删除,而后再创建一个新的视图。可以是删除和创建之间有可能产生间隔。所以在实际之中,由于视图使用频率较高,而且直接与开发有关系,那么一般情况下不会选择删除后再重新创建,而是选择进行视图的替换。利用新的查询替换掉旧的查询。所以改下如下👇:

create or replace view myview
    as
select d.deptno,d.dname,d.loc,temp.count
from dept d,(select deptno,count(*) count
             from emp
             group by deptno) temp
where d.deptno=temp.deptno(+);

此时表示如果现在视图存在则进行替换,如果视图不存在则进行删除。
在这里插入图片描述
然后在开发中,开发者直接使用如下语句查询接可以了

select * from myview;

在这里插入图片描述
从实际的开发分工来讲,此部分的操作应该是由数据库开发人员进行的,但是从现实来讲,这基本上除了大的开发团队之外,大部分的中小开发团队都会由开发人员自己编写。

2、视图的更新操作

实际上视图中只是包含有查询语句的临时数据,并不是真是存在的,可以在默认情况下创建的视图是可以直接进行修改操作的。

create or replace view myview 
    as 
select * from emp where deptno=20;

在这里插入图片描述
此时创建的myview视图之中,deptno=20是视图数据存在的一个依据,但是默认情况下,此依据是可以修改的

2.1 范例1: 更新视图中数据的部门编号

范例1: 更新视图中数据的部门编号(视图的存在条件)

update myview set deptno=30 where empno=7369;

在这里插入图片描述
接着来看看传统的emp中的数据
在这里插入图片描述
发现此时更新了视图,结果导致emp表中的内容也发生了变化。所以为了保证视图的创建条件不能够被更新,则可以在创建视图的时候使用withcheck option子句

先把之前的数据恢复一下👇:
在这里插入图片描述
接着在之前视图的基础上加上withcheck option 子句👇:

create or replace view myview 
    as 
select * from emp where deptno=20
with check option;

在这里插入图片描述
此时使用了withcheck option 子句可以保证视图的创建条件不被更新,如果使用了更新,则将出现如下的错误👇:

update myview set deptno=30 where empno=7369;

在这里插入图片描述
但是视图中不光存在有创建条件的字段,还可能会包含有其他字段。可是在现在的操作中可以修改视图中的其他字段内容。

2.1 范例1: 修改其他字段

范例1: 修改其他字段(不是视图的存在条件)

update myview set sal=80000 where empno=7369;

在这里插入图片描述
在这里插入图片描述
此时的操作的成功了,发现视图更新时,改变的是数据表中的数据,那么这样的做法同样也是不合理的。就好比给你发的一张工资条,你不满意,改成了80000,然后数据库的数据就变了,那多神奇啊

所以一般在创建视图的时候,由于里面都属于映射的数据,那么本质上就不建议其进行修改,最好的视图就是创建一个只读视图。使用with read only 子句完成。

create or replace view myview 
    as 
select * from emp where deptno=20
with read only;

在这里插入图片描述
现在就创建好了一个只读视图信息,于是再次发出修改操作的时候出现如下错误,无法对只读视图进行DML操作,这样就避免了通过视图的临时数据修改数据表真实数据的影响
在这里插入图片描述

疑问?我觉得直接改视图挺方便的,为什么你非说要使用只读视图呢?

以上的讲解只是为了解决问题,但是如果现在只是单表查询,封装为视图有个屁用吗?直接查还方便吧。所以要知道的是视图是包装复杂查询,那么下面写一个复杂查询的包装。(查询雇员的编号、姓名、职位、所在的部门信息,他的雇员工资和他的领导名字)

create or replace view myview 
    as 
select e.empno,e.ename ename,e.job,d.dname,e.sal,m.ename mname
from emp e,dept d,emp m
where e.deptno=d.deptno and e.mgr=m.empno(+);

在这里插入图片描述
此时的复杂查询封装为视图才觉得是有意义的。那么此时没有增加什么with check option、with read only 的操作,直接进行更新操作。

update myview set sal=80000,dname='SALES',mname='KING'
where empno=7902;

在这里插入图片描述
此时没有增加限制条件,但是执行出现了 “无法通过联接视图修改多个基表” 的错误提示信息。如果这种情况下我们真的要改,那么可以使用替代触发器完成。

3、总结

理论上从正规的开发项目来讲,一个数据库之中应该包含很多个视图,但是在现实的开发之中,有些团队不使用视图。好好的学习好复杂查询


下一篇👉Oracle-----同义词&索引

本篇博客到这就完啦,非常感谢您的阅读🙏,如果对您有帮助,可以帮忙点个赞或者来波关注鼓励一下喔😬 ,嘿嘿👀

Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐