Oracle-视图

章节目标

  • 通过本章学习,学员应达到如下目标:
    • 理解视图的作用、分类;
    • 掌握视图创建、修改、删除;
    • 掌握如何从视图中检索数据;

本章内容

数据库对象

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

什么是视图?

  • 视图是逻辑上来自一个或多个表的数据集合。

为什么使用视图

  • 限制其它用户对数据库表的访问,因为视图可以有选择性的显示数据库表的一部分;
  • 容易实现复杂的查询;
  • 对于相同的数据可以产生不同的视图;

视图分类

  • 视图分为简单视图和复杂视图,最基本差别在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-视图)