oracle视图 作者:马育民 • 2019-09-07 22:57 • 阅读:10100 # 概述 视图是一种 **虚表**。在物理上并不存在,也就是不占用磁盘空间 视图 建立 在 **已有表** 的基础上 ### 为什么使用视图 1. 方便查询 2. 控制数据访问 比如工资的信息不让其他人查询、修改,那么就就原表的访问权限仅限个别人查看,然后创建视图,该视图没有工资列,并将该视图的权限让所有人可访问 # 视图的操作 ### 创建视图 ``` create view 视图名 as select 语句 ``` ### 创建或修改视图 如果没有该视图就创建,如果有该视图就修改 ``` create or replace view 视图名 as select 语句 ``` ### 删除视图 ``` drop view 视图名 ``` 删除视图不影响原表的数据 # 对视图中数据的增删改查 ### 查询视图的数据 与查询表中数据的方式相同 ### 修改视图的数据 与修改表中数据的方式相同 ### 删除视图的数据 与删除表中数据的方式相同 # 禁止对视图数据增删改操作 使用```with read only``` 禁止对视图数据进行 **增删改** 操作 ``` create or replace view 视图名 as select 语句 with read only ``` 之后如果再对视图中的数据进行 **增删改** 操作,会 **报错** # 复杂视图 简单视图 和 复杂视图的区别 |特性 |简单视图 |复杂视图 | | ------------ | ------------ | ------------ | |表的数量 |一个 |一个或多个 | |函数 |没有 |有 | |分组 |**没有** |有 | |增删改操作(DML) |可以 |有时可以 | ### 例子 ``` create or replace view emp_info as select d.dname, e.ename, e.job, e.sal from dept d left join (select * from emp a, (select deptno b_deptno, max(sal) as max_sal from emp group by deptno) b where a.sal = b.max_sal) e on d.deptno = e.deptno ``` ### 复杂视图 增删改 数据的限制 当视图包含以下元素之一时,不能执行```insert```语句: - 多行函数 - group by - distinct - rownum - 列的定义为表达式 - 表中 **不允许为空** 的 **列** 在视图定义中 **未包括** 当视图包含以下元素之一时,不能执行```delete```语句: - 多行函数 - group by - distinct - rownum 当视图包含以下元素之一时,不能执行```update```语句: - 多行函数 - group by - distinct - rownum - 列的定义为表达式 原文出处:http://malaoshi.top/show_1EF41duNFYTB.html