视图(view)是一种虚拟存在的表,其内容由查询定义 本身并不包含数据。
它是作为一个select语法查询到的结果集,以此为基表创建的一张虚拟表 基表
行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成
[视图中的数据发送了改变,原始表中的数据也会变化,原始表中的数据发生了变化视图中的数据也会变化]
目的
安全原因 隐藏部分列信息
化繁从简 多表转成单表显示
语法
CREATE VIEW <视图名>[(列名组)]AS <子查询>
DROP VIEW <视图名>
TODO 物化视图
授权 请 以 system 用户操作
grant create view to scott;
创建视图
create or replace view v_classinfo as select * from classinfo;
查询视图
select * from v_classinfo;
更改视图数据
insert into v_classinfo values( 1004, 'YC04班'); -- 违反唯一约束条件
insert into v_classinfo values( 1005, 'YC05班'); -- 可以插入数据
同步到基表数据 反之 同理
select * from classinfo;
视图得字段定义别名
create or replace view v_classinfo(班级名) as select cname from classinfo;
-- 主键 和 not null列 如果没出现在视图中 也不能进行插入操作
insert into v_classinfo values( 'YC06班');
检查视图
create or replace view v_classinfo(班级班号, 班级名)
as select cid, cname from classinfo where cname = 'YC07班'
with check option -- 第一次不加 插入失败
-- 不加 with check option 数据插入到基表中 但是视图中不存在
insert into v_classinfo values( 1006, 'YC06班');
-- 加with check option 当满足 where条件从能插入视图中
insert into v_classinfo values( 1007, 'YC07班');
只读视图
create or replace view v_classinfo(班级班号, 班级名)
as select cid, cname from classinfo where cname = 'YC08班'
with read only;
insert into v_classinfo values( 1008, 'YC08班'); -- 限制插入 该视图只读 不能更新
select * from v_classinfo;
select * from classinfo;
– 查询部门编号20的 所有员工存储在视图中
create or replace view vw_emp_dept_20 as
select empno, ename, sal, e.deptno, dname from emp e, dept d where e.deptno = d.deptno and e.deptno = 20;
select * from vw_emp_dept_20;
– ORA-01779:无法修改与非键值保存表对应的列
update vw_emp_dept_20 set sal = 10000 where empno = 7788;
– 删除视图
drop view v_classinfo;
ORA-01733此处不允许虚拟列-只读视图无法更新
ORA-01402视图WITH CHECK OPTIDN where子句违规