目录
定义
视图中不存放数据,他只是一个定义(物化视图除外)
踏实经过制定的方式来显示一个或多个表的数据
视图所依据的表被称为基表
他可以提供另一种级别的表安全性,不想被看到的内容不会显示
可以使复杂的数据隐藏起来
简化多表查询的sql
通过对列的重命名,进行另一个角度的数据提供
创建语法
create [or replace] [force] view VIEW_NAME [(alias[, alias]…)] as SELECT_STATEMENT [witch check option] [with read only]; |
测试
查询emp表中每位员工的部门位置以及工资等级情况
方法一 多表关联查询
SQL> select e.ename,d.dname,s.grade from emp e,dept d,salgrade s where e.deptno=d.deptno and e.sal between s.losal and s.hisal order by grade; |
sql太长了,如果想简化sql,可以将查询的数据插入到一个新的表中
方法二 创建中间表来使查询简化
SQL> create table tb_view01 as select e.ename,d.dname,s.grade from emp e,dept d,salgrade s where e.deptno=d.deptno and e.sal between s.losal and s.hisal order by grade; |
这样虽然可以select *,但是tb_view01不能随着基表变化
方法三 创建视图
SQL> create view view_01 as select e.ename,d.dname,s.grade from emp e,dept d,salgrade s where e.deptno=d.deptno and e.sal between s.losal and s.hisal order by grade; |
创建视图
创建视图需要有create view权限
如果没有则会报错
SQL> conn scott/tiger; |
授权方式很简单
SQL> conn / as sysdba |
使用revoke即可回收
SQL> conn / as sysdba |
可以通过视图对基表进行dml操作,前提是视图中必须有几表关键字段
SQL> update view_02 set ename='HAHA' where ename='SMITH'; |
另外如果基表主键中的定义在视图中没有,那么也无法对基表进行赋值
SQL> insert into view_02 values('AAA'); |
视图修改
with read only子句
将view_02修改为with read only 属性
SQL> create or replace view view_02 as select ename,sal from emp with read only; |
将视图改为只读以后增、删、改等DML都不允许了
SQL> insert into view_02 values('HAHA',9999); |
with check option子句
满足条件的数据才能通过视图而看到,其他的不可以
修改view_02并添加with check option子句
SQL> create or replace view view_02 as select * from emp where deptno=10 with check option; |
测试通过视图修改使用with check option限定字段deptno的值,包括外键限定的值
SQL> update view_02 set deptno=40; |
不能通过视图修改不属于deptno=10的数据
SQL> update view_02 set ename='HAHA' where deptno=20; |
基表不能通过视图增、删、改的情况
组函数
当视图中包含组函数的时候,不可以增、删、改
创建测试视图
SQL> create view view_03 as select sum(sal),avg(sal) from emp; |
创建包含组函数的视图时必须要给列起别名
SQL> create view view_03 as select sum(sal) s,avg(sal) a from emp; |
增删改测试
SQL> insert into view_03 values(100,100); |
group by子句
当视图中包含group by子句时,不可以增、删、改
创建测试视图
SQL> create view view_04 as select deptno,sum(sal) s from emp group by deptno; |
增删改测试
SQL> insert into view_04 values(40,9999); |
distinct关键字
当视图中包含distinct关键字的时候,不可以增、删、改
创建测试视图
SQL> create view view_05 as select distinct job from emp; |
增删改测试
SQL> insert into view_05 values('HAHA'); |
字段表达式
当视图中包含功过基表中的字段表达式而得来的信息时,不可以增、改
|
增删改测试
SQL> insert into view_06 values(9999,99999); |
可以对基表进行删除
没有null null列
当视图中不包含基表中被定义为null null的列时,不可以增
创建测试表
SQL> create view view_07 as select ename,job from emp; |
增删改测试
SQL> insert into view_07 values('HAHA','HEHE'); |
删除视图
SQL> drop view view_01; |
因为视图本身没有数据,因此不存在空间释放的问题