• 一、Oracle 操作集
  • 二、Oracle 数据类型
  • 三、Oracle 函数
  • 四、Oracle 视图
  • 五、Oracle 序列
  • 六、Oracle 同义词
  • 七、Oracle 索引
  • 八、Oracle PL/SQL
  • 九、Oracle 存储函数
  • 十、Oracle 存储过程
  • 十一、Oracle 触发器
  • 十二、Oracle 查询

一、视图

  • 视图 是一种数据库对象,是从 一个或者多个 数据表或视图中导出的 虚表
  1. 视图所对应的数据, 并不是真正的存储在 视图 中,而是 存储在所引用的数据表 中。
  2. 视图的结构和数据,是对数据表进行查询的结果。

  • 根据创建视图时给定的条件,视图可以是一个数据表的一部分,也可以是多个基表的联合。
  • 它存储了要执行检索的 查询语句的定义,以便在引用该视图时使用。

  • 使用视图的优点:
  1. 简化数据操作
    视图可以简化用户处理数据的方式。
  2. 着重于特定数据
    不必要的数据 或 敏感数据,可以不出现在视图中。
  3. 视图提供了一个简单而有效的安全机制,可以定制不同用户对数据的访问权限。
  4. 提供向后兼容性
    视图使用户能够在表的架构更改时,为表创建向后兼容接口。
  5. 集中分散数据。
  6. 简化查询语句。
  7. 重用SQL语句。
  8. 保护数据安全。
  9. 共享所需数据。
  10. 更改数据格式。

1. 创建修改视图

CREATE [OR REPLACE] [FORCE] VIEW '视图名'
AS '子查询'
[WITH [CASCADED|LOCAL] CHECK OPTION]
-- 只读。
[WITH READ ONLY]

参数 说明
OR REPLACE 若所创建的试图已经存在,Oracle 自动重建该视图
FORCE 不管基表是否存在,Oracle 都会自动创建该视图
sub_query 一条完整的 SELECT 语句,可以在该语句中定义别名
WITH CHECK OPTION 数据表 插入或修改 的数据行,必须满足视图定义的约束
WITH READ ONLY 该视图上不能进行任何 DML 操作
CREATE OR REPLACE VIEW `v_test`
AS
SELECT * FROM `customers`
WHERE `cus_sex` = 'M'
WITH CHECK OPTION;

2. 查看视图

-- 查看视图结构。
SHOW CREATE VIEW '视图名';

3. 修改视图

ALTER VIEW '视图名' [('列名1' ..., '列名n')]
AS
'select_statement'
[WITH [CASCADED|LOCAL] CHECK OPTION]

4. 删除视图

DROP VIEW [IF EXISTS] '视图名'[,'视图名2'] ... [RESTRICT|CASCADE];
-- RESTRICT:限制。
-- CASCADE:级联。DROP VIEW 'view_name';

二、试图案例


1. 简单视图

  • 如果视图中的语句只是 单表查询,并且 没有聚合函数,我们就称之为 简单视图

  • 需求:创建视图,业主类型 为1 的业主信息。
create or replace view 'view_owners'
as
select * from 'T_OWNERS' where ownertypeid = 1;

  • 查询该视图。
    就像使用表一样,去使用视图就可以了。
select * from 'view_owners' where addressid = 1;

  • 对于简单视图,不仅可以用查询,还可以 增删改 记录。
update 'view_owners' set name='王刚' where id = 2;select * from 'view_owners';
-- 修改后,再次查询表数据,发现表的数据也跟着更改了。
  • 结论:视图其实是一个虚拟的表,它的数据其实来自于表。
  1. 如果更改了视图的数据,表的数据也自然会变化。
  2. 更改了表的数据,视图也自然会变化。
  3. 一个视图所存储的并不是数据,而是一条 SQL 语句。

2. with check option 带检查约束视图

  • 需求:根据 T_ADDRESS(地址表),创建视图 VIEW_ADDRESS。
    内容为 区域ID 为2 的记录。
create or replace view 'view_address'
as
select * from 'T_ADDRESS' where areaid = 2
with check option;

  • 执行更新语句。
    报错。
-- 无法修改成功。
update 'view_address' set areaid = 1 where id = 4;
-- 因为该视图的条件是`arreaid = 2`,不能修改为`arreaid = 1`。
  • 错误信息:
    ORA-01402: view WITH CHECK OPTION where-clause violation

3. with read only 只读视图

  • 如果创建一个视图,并不希望用户能对视图 进行修改。
  • 就需要创建视图时,指定 WITH READ ONLY 选项,这样创建的视图就是一个 只读视图

  • 需求:修改视图为 只读视图。
create or replace view 'view_owners'
as
select * from 'T_OWNERS' where ownertypeid = 1
with read only;

  • 执行更新语句。
    报错。
update 'view_owners' set name='王强' where id = 2;
  • 错误信息:
    ORA-42399: cannot perform a DML operation on a read-only view

4. 带错误视图

  • 创建一个视图,如果视图的 SQL语句 所设计的表并不存在。
-- 错误视图,创建不成功
create or replace view `view_TEMP`
as
-- `T_TEMP`表不存在
select * from 'T_TEMP';
  • 因为 T_TEMP表 并不存在。

  • 有的时候,创建视图时的表可能并不存在,但是以后可能会存在。
  • 如果此时需要创建这样的视图,需要添加 FORCE 选项。
create or replace FORCE view 'view_TEMP'
as
select * from 'T_TEMP';

5. 复杂视图

  • 复杂视图,就是视图的 SQL语句 中,有 聚合函数多表关联查询

5.1 多表关联查询

  • 需求:创建视图,查询显示 业主编号,业主名称,业主类型名称。
create or replace view 'view_owners'
as
select o.id '业主编号', o.name '业主名称', ot.name '业主类型'
from 'T_OWNERS' o, 'T_OWNERTYPE' ot
where o.ownertypeid = ot.id;

  • 查询该视图。
select * from 'view_owners';

  • 修改该视图。
-- 更新成功。
update view_owners set '业主名称' = '范小冰' where '业主编号' = 1;  -- 更新失败。
update view_owners set '业主类型' ='普通居民' where '业主编号' = 1;
  • 出错误提示:是修改的列,不属于 键保留表 的列。
    ORA-01779: cannot modify a column which maps to a non key-preserved table

  • 键保留表。
  1. 键保留表,是理解 连接视图修改限制 的一个基本概念。
  2. 该表的主键列 全部显示在视图中,并且它们的值 在视图中都是 唯一且非空的。
  3. 简单说,表的键值 在一个 连接视图 中也是 键值,那么就称这个表为 键保留表

  • 上面视图中存在两个表,T_OWNERS(业主表)和 T_OWNERTYPE(业主类型表)。
  1. 其中 T_OWNERS表 就是 键保留表。因为 T_OWNERS表 的 主键,也是作为视图的主键。
  2. 键保留表 的 字段 是可以更新的,而 非键保留表 是不能更新的

7.2 分组聚合统计查询

  • 需求:创建视图,按年月统计水费金额。
create view 'view_account_sum'
as
-- 必须 + `money_sum` 别名
select year, month, sum(money) money_sum from 'T_ACCOUNT'
group by year, month
order by year, month;

  • 修改该视图。
update 'view_account_sum'
set money_sum = money_sum - 100
where year = 2012 and month = 12;

  • 此例用到聚合函数,没有键保留表,所以无法执行 update。
    ORA-01732: data manipulation operation not legal on this view

三、物化视图

  • 视图是一个 虚拟表(也可以认为是一条语句)。
  1. 视图 是指定的 查询语句,返回的 结果集。每次访问视图,都会导致这个 查询语句 被执行一次。
  2. 为了避免每次访问都执行这个查询,可以将这个查询结果集存储到一个 物化视图(也叫实体化视图)。

  • 物化视图 与 普通视图 相比的区别是。
  1. 物化视图 是建立的副本。
  2. 物化视图 类似于一张表,需要占用存储空间。
  3. 对一个 物化视图 查询的执行效率,与查询一个表是一样的。
# 物化视图日志(Tables)
MLOG$_'表名'# 物化视图(Tables)
MV_'表名'

1. 创建物化视图

  • 生成数据。
  1. BUILD IMMEDIATE
    在创建物化视图的时候,就生成数据【默认】。
  2. BUILD DEFERRED
    在创建时不生成数据,以后根据需要再生成数据。

  • REFRESH 刷新。
    指当基表发生了 DML 操作后,物化视图 何时采用哪种方式 和 基表进行同步。
  • REFRESH 后跟着的刷新方法,有三种:
    FASTCOMPLETEFORCE
  1. FAST
    采用增量刷新,只刷新自上次刷新以后进行的修改。
  2. COMPLETE
    对整个物化视图进行完全的刷新。
  3. FORCE:【默认
    刷新时去判断是否可以快速刷新。
    如果可以则采用 FAST 方式,否则采用 COMPLETE 方式。

  • 刷新的模式。
  1. ON DEMAND
    指需要手动刷新物化视图【默认】。
  2. ON COMMIT
    指在基表发生 COMMIT操作时,自动刷新。

CREATE MATERIALIZED VIEW 'view_name'
-- 立即显示 | 延迟显示
[ 'BUILD IMMEDIATE' | BUILD DEFERRED ]
-- 快 | 完全 | 快or完全
REFRESH [ FAST | COMPLETE | 'FORCE' ]
[ON [ 'DEMAND' | COMMIT ] | START WITH (start_time) NEXT (next_time)]
AS 'sub_query';

四、物化试图案例


1. 创建 手动刷新 的物化视图

  • 需求:查询 地址ID、地址名称 和 所属区域名称。
create materialized view 'mv_address'
as
select ad.id, ad.name adname, ar.name ar_name
from 't_address' ad, 't_area' ar
where ad.areaid = ar.id;

  • 执行查询语句。
select * from 'mv_address';

  • 向基表 T_ADDRESS(地址表)中插入一条新记录。
insert into 't_address' values (8, '宏福苑小区', 1, 1);

  • 执行视图查询,发现 新插入的数据 并没有出现在物化视图中。
-- 1、手写 PL/SQL 语句,手动刷新 物化视图。
begin-- `C`完全刷新(COMPLETE)DBMS_MVIEW.refresh('MV_ADDRESS', 'C');
end;-- 2、通过下面的命令,手动刷新物化视图。
EXEC DBMS_MVIEW.refresh('MV_ADDRESS', 'C');
-- 注意:此命令需要在命令窗口中执行。
  • DBMS_MVIEW.refresh 是 系统内置 的 存储过程。
    执行命令后,再次查询物化视图,就可以查询到最新的数据了。

2. 创建 自动刷新 的物化视图

  • 创建此物化视图后,当 T_ADDRESS 表发生变化时,MV_ADDRESS 自动跟着改变。
create materialized view 'mv_address_2'
refresh
-- 自动刷新
on commit
as
select ad.id,ad.name adname,ar.name ar_name
from 't_address ad','t_area' ar
where ad.areaid=ar.id;

3. 创建时 不生成数据 的物化视图

create materialized view 'mv_address_3'
-- 创建不生成数据
build deferred
refresh
-- 自动刷新
on commit
as
select ad.id,ad.name adname,ar.name ar_name
from 't_address' ad,'t_area' ar
where ad.areaid=ar.id;

  • 创建后,执行下列语句查询物化视图,没有数据。
 select * from `mv_address_3`;

  • 需执行下列语句,生成数据。
beginDBMS_MVIEW.refresh('MV_ADDRESS3', 'C');
end;
  • 由于创建时指定的 on commit
  • 所以在 修改数据 后,能立刻看到最新数据,无须再次执行 refresh

4. 创建 增量刷新 的物化视图

  • 如果创建 增量刷新 的物化视图,必须首先创建 物化视图日志。
  • 物化视图日志,记录基表发生了哪些变化,用日志去 更新物化视图。
-- 根据`rowid`
create materialized view 'log' on 't_address' with rowid; create materialized view 'log' on 't_area' with rowid;

  • 创建的物化视图日志,名称为 MLOG$_表名称
create materialized view 'mv_address_4'
-- 增量刷新
refresh fast
as
select ad.rowid adrowid, ar.rowid arrowid, ad.id, ad.name adname, ar.name ar_name
-- 需要创建两表日志
from 't_address' ad, 't_area' ar
where ad.areaid = ar.id;

  • 注意:创建 增量刷新 的 物化视图。
  1. 创建物化视图中,涉及表的物化视图日志。
  2. 在查询语句中,必须包含所有表的 rowid(以 rowid 方式建立物化视图日志)

  • 当向地址表插入数据后,物化视图日志的内容。
参数 说明
SNAPTIME$$ 用于表示刷新时间。
DMLTYPE$$ 用于表示 DML 操作类型(I 表示 INSERT,D 表示 DELETE,U 表示 UPDATE)。
OLD_NEW$$ 用于表示这个值是新值,还是旧值(N 表示 NEW新值,O 表示 OLD旧值,U 表示 UPDATE操作)。
CHANGE_VECTOR$$ 表示修改矢量,用来表示被修改的是哪个或哪几个字段(此列是 RAW类型)。
其实 Oracle 采用的方式就是用每个 BIT位 去映射一个列。
插入操作显示为:FE,删除显示为:OO,更新操作则根据更新字段的位置 而显示不同的值。

  • 当手动刷新物化视图后,物化视图日志被清空,物化视图更新。
beginDBMS_MVIEW.refresh('MV_ADDRESS4', 'C');
end;

四、Oracle 视图相关推荐

  1. 图文解说oracle视图

    图文解说oracle视图 一. 概念 <一> 视图是基于一个表或多个表或视图的逻辑表,本身不包含数据,通过它可以对表里面的数据进行查询和修改.视图基于的表称为基表.视图是存储在数据字典里的 ...

  2. Oracle视图分类及各种操作讲解(超级好文)

    目录:一.视图的定义: 二.视图的作用: 三.创建视图: 1.权限 2.语法 3.1  创建简单视图   3.2  创建连接视图  3.2.1 连接视图定义  3.2.2 创建连接视图  3.2.3 ...

  3. Oracle-No.04 Oracle视图加主键解决hibernate复合主键问题

    2019独角兽企业重金招聘Python工程师标准>>> Oracle视图默认是没有主键的,因此在用hibernate反向生成java类时,会自动采用复合主键,多生成一个类名+ID的类 ...

  4. oracle视图能增删改,oracle视图的增删改

    今天客户现场报了个数据库错误,ora01031 权限不足 既然人家oracle都说了权限不足,所以就从权限角度开始排产,结果怎么查权限设置也都没问题. 然后静下心来,透过现象看本质,问题能够定位,是对 ...

  5. mysql. Oracle创建视图,Navicat 教程:Oracle 视图

    Navicat for Oracle 视图用于访问一组关联(表),就像一个单一的表,并限制访问.视图也可以用来限制访问行(一个特定表的子集).点击"视图"按钮即可打开视图对象列表. ...

  6. Oracle视图的作用与安全性

    Oracle视图作为原始的相关数据库中的数据变换,它的主要功能是查看相关表中的某些数据的另外的方式.可以将Oracle视图看成是一个移动的窗口,通过它可以看到感兴趣的数据. 视图是从一个或多个实际表中 ...

  7. oracle开放视图,Oracle视图

    Oracle视图 在Oracle中,视图是实际上并不存在的虚拟表.它存储在Oracle数据字典中,不存储任何数据.可以在调用时执行. 通过连接一个或多个表的查询创建视图. Oracle创建视图 句法: ...

  8. oracle实验四运动会,实验四oracle的安全性和完整性控制

    实验四 oracle的安全性和完整性控制 实验目的: 1.通过本实验能够熟练应用sql语言进行用户权限的授予和回收. 2.熟练掌握实体完整性,参照完整性及用户定义的完整性的定义. 3.并体会oracl ...

  9. Oracle -----视图

    视图简介:  视图是基于一个表或多个表或视图的逻辑表,本身不包含数据,通过它可以对表里面的数据进行查询和修改.视图基于的表称为基表.视图是存储在数据字典里的一条select语句. 通过创建视图可以提取 ...

  10. php预览ppt,演示文稿幻灯片有哪四种视图模式?

    四种视图模式为:1."普通"视图模式,由大纲栏.幻灯片栏和备注栏组成:2."幻灯片浏览"视图模式,以最小化的形式显示演示文稿中的所有幻灯片:3."备注 ...

最新文章

  1. Linux服务部署常用命令--top、free、df、scp
  2. 海思108M 4D1模式含义
  3. canal mysql 数据同步
  4. html中怎么定义搜索框?html中search类型?
  5. 阿里科学家再获世界级荣誉,平头哥首席科学家谢源当选AAASFellow
  6. OpenCv学习笔记(二)--Mat矩阵(图像容器)的创建及CV_8UC1,CV_8UC2等参数详解
  7. python 引用文件中的类 报错_Python学习笔记7 头文件的添加规则(转载)
  8. 大学c语言电脑考试判卷,全国计算机等级考试判卷的玄机
  9. 在Linux 中如何从进程相关的文件描述中恢复数据
  10. 《黑客大曝光:移动应用安全揭秘及防护措施》一3.5 小结
  11. vim 模式下的几个快捷用法
  12. 移动终端安全模块技术研究
  13. “不用着急,慢慢来”,英语怎么说?
  14. 数据库实验2:简易登录页面设计(c#)
  15. 绕过AppLocker系列之控制面板的利用
  16. 脉搏信号检测与处理系统
  17. 【功能安全】【ISO26262】生产和运行
  18. 如何保养笔记本的电池
  19. 西宁服务器维修,青海西宁移动DNS服务器IP地址
  20. 迈瑞医疗测试实习岗面试(已拿offer)

热门文章

  1. 树莓派蜂鸣器python代码_树莓派之蜂鸣器模块基础应用
  2. 9.9 单片机蜂鸣器
  3. 删除linux下的.文件,Linux删除文件命令汇总
  4. 2015第19周五《象与骑象人》《瞬变》读书笔记
  5. 在实时控制系统中使用传感器优化数据可靠性的3个技巧
  6. [精简]托福核心词汇23
  7. 弄清楚DL,D-H,CDH problem,CDH assumption,DDH,BDDH,BCDH
  8. python读excel两列为字典_python交换数据的两列,python处理excel数据,  python交换...
  9. 算法复杂度分析,算法复杂度o(1), o(n), o(logn), o(nlogn) 时间复杂度On和空间复杂度O1是什么意思?
  10. jQuery-获取验证码