--================================
-- SQL 基础--> 视图(CREATE VIEW)
--================================
视图:
从表中抽出来的逻辑上相关的数据集合
视图其实就是一条查询SQL语句,用于显示一个或多个表或其它视图中相关数据。
视图将查询的结果作为一个表来使用,因此视图可以被看作是存储的查询或一个虚拟表
视图来源于表,所有对视图数据的修改最终都会被反映到视图的基表中,这些修改必须服从基表的完整性约束,并同样会触发定义
在基表上的触发器。(Oracle支持在视图上显式的定义触发器和定义一些逻辑约束)
使用视图的好处:
可把复杂的SQL语句简单化
可保证数据的安全性,限制对数据的访问,因为它对表中的一些字段是隐藏的
可使相同的数据以不同形式出现在不同的视图中
视图分类:
简单视图
只从一个表中获取数据
不包含函数
不包含分组数据
可通过该视图进行DML操作
复杂视图
从多个表中获取数据
包含函数
包含分组数据
不一定能通过视图进行DML操作
创建视图:
CREATE [OR REPLACE] [FORCE |NOFORCE ]VIEW view_name [alias [,alias]...]
AS subquery
[WITH CHECK OPTION]
[WITH READ ONLY]
OR REPLACE 如果视图存在,重建、修改这个视图
FORCE 不管引用的表是否存在,都创建这个视图
NOFORCE 只有当表存在的时候,才能创建这个视图(默认方式)
WITH CHECK OPTION 只有子查询能够检索出的行才能够被插入,修改,或删除。默认情况下对此不作检查
没有指定约束名,系统会自动为约束命名,形式为SYS_Cn。
WITH READ ONLY 只读,不可对视图做DML操作
需要注意的是,在子查询中不能包含ORDER BY ,子查询可以是复杂的SELECT语句
修改视图
使用CREATE OR REPLACE VIEW 子句修改视图
删除视图:
DROP VIEW view_name
视图中使用DML的规定:
当视图定义中含有以下元素之一不能使用INSERT
组函数
GROUP BY、ORDER BY
DISTINCT
ROWNUM
列的定义为表达式
表中非空的列,在视图定义中未包括
视图定义含有以下元素不能使用UPDATE
组函数
GROUP BY、ORDER BY
DISTINCT
ROWNUM
列的定义为表达式
视图包含以下元素不能DELETE
组函数
GROUP BY、ORDER BY
DISTINCT
ROWNUM
与视图有关的数据字典:
DBA_VIEWS
USER_VIEWS
--演示创建视图
SQL> create or replace view vw_emp as
2 select empno,ename,sal from emp where sal >2500;
View created.
SQL> select * from vw_emp;
EMPNO ENAME SAL
---------- ---------- ----------
7566 JONES 2975
7698 BLAKE 2850
7788 SCOTT 3000
7839 KING 5000
7902 FORD 3000
SQL> update vw_emp set sal = 3500 where ename = 'FORD'; --可以更新并且直接修改了基表
1 row updated.
SQL> select * from emp where ename = 'FORD';
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7902 FORD ANALYST 7566 03-DEC-81 3500 20
SQL> insert into vw_emp select 9999,'Robinson',6000 from dual; --可以插入并且直接修改了基表
1 row created.
SQL> select * from emp where empno = 9999;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
9999 Robinson 6000
1 rows selected.
SQL> delete from emp where ename = 'Robinson'; --可以删除并且直接修改了基表
1 row deleted.
SQL> select * from vw_emp;
EMPNO ENAME SAL
---------- ---------- ----------
7566 JONES 2975
7698 BLAKE 2850
7788 SCOTT 3000
7839 KING 5000
7902 FORD 3500
SQL> rollback;
Rollback complete.