Oracle-视图
原创约 1595 字大约 5 分钟...
32-Oracle-视图.md
注意
本博文仅供学术研究和交流参考,严禁将其用于商业用途。如因违规使用产生的任何法律问题,使用者需自行负责。
章节目标
- 通过本章学习,学员应达到如下目标:
- 理解视图的作用、分类;
- 掌握视图创建、修改、删除;
- 掌握如何从视图中检索数据;
本章内容

数据库对象
表 | 表是用来存放用户数据的对象,由行和列组成,列就是字段,行就是表中的记录 |
约束 | 保证数据完整性的规则,设置在单个字段或者多个字段组合上,写入这些字段的数据必须符合约束的限制 |
视图 | 是一个命名的查询,用于改变基表数据的显示,通过视图能简化查询;访问方式与表相同 |
索引 | 构建于表的单字段或都字段组合上,用于加速对表中数据的查询 |
序列 | 产生顺序的不重复数据字串,被作为主键的束值的参照 |
同义词 | 数据库对象的别名 |
什么是视图?
- 视图是逻辑上来自一个或多个表的数据集合。

为什么使用视图
- 限制其它用户对数据库表的访问,因为视图可以有选择性的显示数据库表的一部分;
- 容易实现复杂的查询;
- 对于相同的数据可以产生不同的视图;
视图分类
- 视图分为简单视图和复杂视图,最基本差别在DML操作上
特征 | 简单视图 | 复杂视图 |
基表数量 | 一个 | 一个或多个 |
包含函数 | 没有 | 有 |
包含数据组 | 没有 | 有 |
通过视图实现DML操作 | 可以 | 不一定 |
创建视图
- 创建视图语法;
CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW viewname
[(column[, column]...)]
AS subquery
[WITH CHECK OPTION [CONSTRAINT constraintname]]
[WITH READ ONLY]
OR REPLACE:如果所创建的视图已经存在,该选项表示修改原视图的定义;
FORCE:不管视图所基于的基表是否存在,都会创建该视图;
NOFORCE:只有视图所基于的基表都存在,才会创建该视图;
viewname :视图的名称;
column :列名,列名的数量必须和视图所对应查询语句的列数量相等;
subquery:一条完整的SELECT语句;
WITH CHECK OPTION:一个约束条件,通过视图所插入或修改的数据行必须满足视图所定义的查询; constraintname:约束名;
WITH READ ONLY:确保在该视图上不能进行任何DML操作;
例:创建一个视图v_emp10,通过该视图只能查看10号部门的员工编号,员工姓名,职位。
SQL> CREATE VIEW empvu10
2 AS SELECT empno, ename, job
3 FROM emp
4 WHERE deptno = 10;
View created.
- 在用SQL*Plus中,可以使用DESC命令显示视图的结构。
SQL> DESC empvu10
- 创建视图时,在子查询中使用列的别名
SQL> CREATE VIEW salvu30
2 AS SELECT empno EMPLOYEE_NUMBER, ename NAME,
3 sal SALARY
4 FROM emp
5 WHERE deptno = 30;
View created.
创建复杂视图
- 例:创建一个视图,通过该视图可以查看每个部门的名称,最低工资,最高工资,平均工资
SQL> CREATE VIEW dept_sum_vu
2 (name, minsal, maxsal, avgsal)
3 AS SELECT d.dname, MIN(e.sal), MAX(e.sal),
4 AVG(e.sal)
5 FROM emp e, dept d
6 WHERE e.deptno = d.deptno
7 GROUP BY d.dname;
View created.
- 从视图中检索数据,同从表中检索数据一样,只不过是只能看到视图所定义的那些列。
SQL> SELECT *
2 FROM salvu30;
EMPLOYEE_NUMBER NAME SALARY
--------------- ---------- ---------
7698 BLAKE 2850
7654 MARTIN 1250
7499 ALLEN 1600
7844 TURNER 1500
7900 JAMES 950
7521 WARD 1250
6 rows selected.
修改视图
- 用 CREATE OR REPLACE VIEW子句修改视图empvu10,为每个列添加别名。
SQL> CREATE OR REPLACE VIEW empvu10
2 (employee_number, employee_name, job_title)
3 AS SELECT empno, ename, job
4 FROM emp
5 WHERE deptno = 10;
View created.
- CREATE VIEW子句中别名的顺序必须和内部查询中的列的顺序一一对应。
视图上执行DML操作的规则
- 在简单视图上可以执行 DML 操作;
- 您可以通过视图删除基表中数据,只要视图中不出现以下情况:
- Group 函数;
- GROUP BY 子句;
- DISTINCT 关键字;
- 您可以通过视图修改基表中数据,只要视图中不出现以下情况:
- GROUP函数、GROUP BY子句,DISTINCT关键字;
- 使用表达式定义的列;
- ROWNUM 伪列;
- 您可以通过视图向基表插入数据,只要视图中不出现以下情况:
- GROUP函数、GROUP BY子句,DISTINCT关键字;
- 使用表达式定义的列;
- ROWNUM 伪列;
- 基表中未在视图中选择的其它列定义为非空并且没有默认值;
WITH CHECK OPTION 子句
- 如果要确保在视图上执行的DML操作仅限于一定的范围,便可使用WITH CHECK OPTION子句;
SQL> CREATE OR REPLACE VIEW empvu20
2 AS SELECT *
3 FROM emp
4 WHERE deptno = 20
5 WITH CHECK OPTION CONSTRAINT empvu20_ck;
View created.
- 在视图中任何修改部门编号的操作都会失败,因为这违反了 WITH CHECK OPTION约束。
拒绝 DML 操作
- 在视图定义时使用WITH READ ONLY选项,可以确保不能对视图执行DML操作;
SQL> CREATE OR REPLACE VIEW empvu10
2 (employee_number, employee_name, job_title)
3 AS SELECT empno, ename, job
4 FROM emp
5 WHERE deptno = 10
6 WITH READ ONLY;
View created.
- 任何试图执行DML的操作都会导致一个错误ORA-01752。
删除视图
- 删除视图并不会删除数据,因为视图是基于数据库中的基表的虚表。
DROP VIEW view;
SQL> DROP VIEW empvu10;
View dropped.
相关数据字典
USER_VIEWS:字典中包含了视图的定义。
USER_UPDATABLE_COLUMNS:字典包含了哪些列可以更新、插入、删除。
USER_OBJECTS:字典中包含了用户的对象。
本节重点总结
- 理解视图的作用、分类;
- 掌握如何创建简单视图;
- 掌握如何创建复杂视图;
- 理解带约束视图的含义;
- 理解只读视图的含义;
- 掌握如何从视图中检索数据;
- 掌握修改、删除视图;
- 了解通过视图执行DML操作的规则;
分割线
相关信息
以上就是我关于 Oracle-视图 知识点的整理与总结的全部内容,希望对你有帮助。。。。。。。
Powered by Waline v2.15.4