视图
一、视图的定义
视图也称为虚表,视图本身不占用物理存储空间,视图存放于数据字典中,简单的来说视图可以看做是sql语句的集合。视图从数据库中的表产生,这些表称为视图的基表,一个视图可以从另一个视图中产生。
视图看上去非常像数据库的物理表,对它的操作同任何其它的表一样。当通过视图修改数据时,实际上是在改变基表中的数据;相反地,基表数据的改变也会自动反映在由基表产生的视图中。由于逻辑上的原因,有些Oracle视图可以修改对应的基表,有些则不能(仅仅能查询)。
对视图的查询没有限制,对视图的插入、删除、更新一般会有限制,所以为防止通过视图来修改基表的数据可以将视图创建为只读(带with read only)
二、视图的作用
1)提供各种数据表现形式,可以使用各种不同的方式将基表的数据展现在用户面前, 以便符合用户的使用习惯(主要手段: 使用别名);
2)隐藏数据的逻辑复杂性并简化查询语句,多表查询语句一般是比较复杂的,而且用户需要了解表之间的关系,否则容易写错;如果基于这样的查询语句创建一个视图,用户就可以直接对这个视图进行"简单查询"而获得结果。这样就隐藏了数据的复杂性并简化了查询语句。这也是oracle提供各种"数据字典视图"的原因之一,all_constraints就是一个含有2个子查询并连接了9个表的视图(在catalog.sql中定义);
3)执行某些必须使用视图的查询。某些查询必须借助视图的帮助才能完成。 比如,有些查询需要连接一个分组统计后的表和另一表,这时就可以先基于分组统计的结果创建一个视图,然后在查询中连接这个视图和另一个表就可以了;
4)提供某些安全性保证。视图提供了一种可以控制的方式,即可以让不同的用户看见不同的列,而不允许访问那些敏感的列,这样就可以保证敏感数据不被用户看见;
5)简化用户权限的管理。可以将视图的权限授予用户, 而不必将基表中某些列的权限授予用户, 这样就简化了用户权限的定义。
三、视图创建
创建单表视图
create view vw_emp as select empno,ename,job,hiredate,deptno from emp; select * from vw_emp where deptno=10;
创建多表视图
create view emp_dept as select e.empno,e.ename,d.deptno,d.dname from emp e join dept d on e.deptno=d.deptno
对简单视图进行DML操作(增删改查):
insert into vw_emp values(1,'a','aa',to_date('2018.5.1','yy.mm.dd'),10); update vw_emp set ename='cc' where ename='KING'; delete vw_emp where ename='cc'; select * from vw_emp where deptno=10
基表也发生了相应的更改:
select empno,ename,job,hiredate,deptno from emp where deptno=10;
创建只读视图:
create or replace view vw_emp as select empno,ename,job,hiredate,deptno from emp with read only;
删除视图:
可以删除当前模式中的任何视图;
如果要删除其他模式中的视图,必须拥有DROP ANY VIEW系统权限;
视图被删除后,该视图的定义会从词典中被删除,并且在该视图上授予的“权限”也将被删除。视图被删除后,其他引用该视图的视图及存储过程等都会失效。
drop view vw_test;
四、查看视图
使用数据字典视图:
1、 dba_views——DBA视图描述数据库中的所有视图
2、 all_views——ALL视图描述用户“可访问的”视图
3、 user_views——USER视图描述“用户拥有的”视图
4、 dba_tab_columns——DBA视图描述数据库中的所有视图的列(或表的列)
5、 all_tab_columns——ALL视图描述用户“可访问的”视图的列(或表的列)
6 、user_tab_columns——USER视图描述“用户拥有的”视图的列(或表的列)
视图的视图:
在视图的基础上创建新的视图
无源表视图:
在没有源表时允许创建视图,不过要等到源表创建完成后才能使用
Create force view 视图名 as select * from 表名
内嵌视图的使用:
内嵌视图不需要视图名称,只是一段SQL语句,可在增删改中使用
select empno from( select * from emp where rownum<5 ) order by empno
数据库中表与视图的联系与区别?
联系:
视图(view)是在基本表之上建立的表,它的结构(即所定义的列)和内容(即所有数据行)都来自基本表,它依据基本表存在而存在。一个视图可以对应一个基本表,也可以对应多个基本表。视图是基本表的抽象和在逻辑意义上建立的新关系。
区别:
1、视图是已经编译好的sql语句。而表不是
2、视图没有实际的物理记录。而表有。
3、表是内容,视图是窗口
4、表只用物理空间而视图不占用物理空间,视图只是逻辑概念的存在,表可以及时四对它进行修改,但视图只能有创建的语句来修改
5、表是内模式,视图是外模式
6、视图是查看数据表的一种方法,可以查询数据表中某些字段构成的数据,只是一些SQL语句的集合。从安全的角度说,视图可以不给用户接触数据表,从而不知道表结构。
7、表属于全局模式中的表,是实表;视图属于局部模式的表,是虚表。
8、视图的建立和删除只影响视图本身,不影响对应的基本表。
视图是数据库中特有的对象。视图用于存储查询,但不会存储数据(物化视图除外)。这是视图和数据表的重要区别。可以利用视图进行查询、插入、更新和删除数据。
Oracle中有4 中视图:
1. 关系视图
2. 内嵌视图
3. 对象视图
4. 物化视图
由于关系视图并不存储真实的数据, 因此占用数据库资源也较少。
1、什么时候使用视图呢?
应用场景1:保密工作,比如有一个员工工资表,如果你只希望财务看到员工工资这个字段,而其他人不能看到工资字段,那就用一个视图,把工资这个敏感字段过滤掉。
应用场景2:有一个查询语句非常复杂,大概有100行这么多,有时还想把这个巨大无比的select语句和其他表关联起来得到结果,写太多很麻烦,可以用一个视图来代替这100行的select语句,充当一个变量角色。
2、什么时候用临时表呢?
应用场景1:你在短期内有很多DML操作,比如京东淘宝亚马逊的购物车表,把东西放购物车(insert),变更数量(update),删除商品(delete),一旦结算金钱后,这些数据就要清掉,这时需要用临时表。
应用场景2:在导出数据时,你可能不想导完整的数据库,或者表,你可能只想要导出符合某些条件的数据,那么你可以创建临时表,把select语句插入到临时表,接着导出这个临时表,导完以后通过结束session或者事务的方式,让这些没用的数据自动清理掉。
应用场景3:你在写存储过程时,有很多的连接,比如你需要连接A,B,C,D,E,F,G,H那么多张表,才能得到你的结果表,同时做连接的消耗太大,你可以先A,B,C连接的结果,放在临时表,接着再把这张临时表,跟D,E,F连接,作为新的结果放在临时表,接着再把临时表与G,H连接,最后得到临时表数据,一次插入到结果表(永久表)。
视图的作用:
第一点:使用视图,可以定制用户数据,聚焦特定的数据。
解释: 在实际过程中,公司有不同角色的工作人员,我们以销售公司为例的话, 采购人员,可以需要一些与其有关的数据,而与他无关的数据,对他没 有任何意义,我们可以根据这一实际情况,专门为采购人员创建一个视 图,以后他在查询数据时,只需select * from view_caigou 就 可以啦。
第二点:使用视图,可以简化数据操作。
解释:我们在使用查询时,在很多时候我们要使用聚合函数,同时还要 显示其它字段的信息,可能还会需要关联到其它表,这时写的语句可能 会很长,如果这个动作频繁发生的话,我们可以创建视图,这以后,我 们只需要select * from view1就可以啦~,是不是很方便呀~
第三点:使用视图,基表中的数据就有了一定的安全性
解释: 因为视图是虚拟的,物理上是不存在的,只是存储了数据的集合,我们可以 将基表中重要的字段信息,可以不通过视图给用户,视图是动态的数据的集 合,数据是随着基表的更新而更新。同时,用户对视图,不可以随意的更改 和删除,可以保证数据的安全性。 第四点:可以合并分离的数据,创建分区视图(//目前我没用到) 解释: 随着社会的发展,公司的业务量的不断的扩大,一个大公司,下属都设有很 多的分公司,为了管理方便,我们需要统一表的结构,定期查看各公司业务 情况,而分别看各个公司的数据很不方便,没有很好的可比性,如果将这些 数据合并为一个表格里,就方便多啦,这时我们就可以使用union关键字, 将各分公司的数据合并为一个视图。