0

0

归纳总结Oracle视图知识点

WBOY

WBOY

发布时间:2022-05-24 13:51:39

|

2380人浏览过

|

来源于CSDN

转载

本篇文章给大家带来了关于oracle的相关知识,其中主要介绍了关于视图的相关问题,视图 是一种数据库对象,是从一个或者多个数据表或视图中导出的 虚表,下面一起来看一下,希望对大家有帮助。

归纳总结Oracle视图知识点

推荐教程:《Oracle视频教程

Figma
Figma

Figma 是一款基于云端的 UI 设计工具,可以在线进行产品原型、设计、评审、交付等工作。

下载

一、视图

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

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

  • 使用视图的优点:
  1. 简化数据操作:视图可以简化用户处理数据的方式。
  2. 着重于特定数据:不必要的数据或敏感数据,可以不出现在视图中。
  3. 视图提供了一个简单而有效的安全机制,可以定制不同用户对数据的访问权限。
  4. 提供向后兼容性:视图使用户能够在表的架构更改时,为表创建向后兼容接口。

1. 创建修改视图

CREATE [OR REPLACE] [FORCE] VIEW 'view_name'AS 'sub_query'[WITH CHECK OPTION]-- 只读[WITH READ ONLY]

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

2. 删除视图

DROP VIEW 'view_name';

二、试图案例


1. 简单视图

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

  • 需求:创建视图,业主类型为 1 的业主信息。
create or replace view `view_owners` asselect * 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,内容为 区域ID2 的记录。
create or replace view `view_address` asselect * from T_ADDRESS where areaid = 2 with check option;
  • 执行更新语句,报错。
-- 无法修改成功-- 因为该视图的条件是`arreaid = 2`,不能修改为`arreaid = 1`。update `view_address` set areaid = 1 where id = 4;
  • 错误信息:
    ORA-01402: view WITH CHECK OPTION where-clause violation
    在这里插入图片描述

3. with read only 只读视图

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

  • 需求:修改视图为只读视图。
create or replace view `view_owners` asselect * 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` asselect * from `T_TEMP`;

5. 复杂视图

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

5.1 多表关联查询

  • 需求:创建视图,查询显示业主编号,业主名称,业主类型名称。
create or replace view `view_owners` asselect 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 表就是 键保留表
  2. 因为 T_OWNERS 的主键也是作为视图的主键。
  3. 键保留表的字段是可以更新的,而非键保留表是不能更新的

7.2 分组聚合统计查询

  • 需求:创建视图,按年月统计水费金额。
create view `view_account_sum` as-- 必须 + `money_sum` 别名select year, month, sum(money) money_sum from `T_ACCOUNT` group by year, monthorder 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. 每次访问它,都会导致这个查询语句被执行一次。
  3. 为了避免每次访问都执行这个查询,可以将这个查询结果集存储到一个 物化视图(也叫实体化视图)。

  • 物化视图 与普通的视图相比的区别是。
  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`asselect 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;

  1. 或者通过下面的命令,手动刷新物化视图。
-- 注意:此命令需要在命令窗口中执行。EXEC DBMS_MVIEW.refresh('MV_ADDRESS', 'C');
  • DBMS_MVIEW.refresh 是系统内置的存储过程。
  • 执行命令后,再次查询物化视图,就可以查询到最新的数据了。

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

  • 创建此物化视图后,当 T_ADDRESS 表发生变化时,MV_ADDRESS 自动跟着改变。
create materialized view `mv_address_2`refresh-- 自动刷新on commit asselect 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 asselect 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`;

  • 执行下列语句生成数据。
begin
   DBMS_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 
asselect 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 表示 INSERTD 表示 DELETEU 表示 UPDATE)。
OLD_NEW$$ 用于表示这个值是新值还是旧值(NEW)表示新值,OLD)表示旧值,U 表示 UPDATE 操作)。
CHANGE_VECTOR$$ 表示修改矢量,用来表示被修改的是哪个或哪几个字段(此列是 RAW 类型)。
其实 Oracle 采用的方式就是用每个 BIT 位去映射一个列。
插入操作显示为:FE,删除显示为:OO,更新操作则根据更新字段的位置而显示不同的值。

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

推荐教程:《Oracle视频教程

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python 自然语言处理(NLP)基础与实战
Python 自然语言处理(NLP)基础与实战

本专题系统讲解 Python 在自然语言处理(NLP)领域的基础方法与实战应用,涵盖文本预处理(分词、去停用词)、词性标注、命名实体识别、关键词提取、情感分析,以及常用 NLP 库(NLTK、spaCy)的核心用法。通过真实文本案例,帮助学习者掌握 使用 Python 进行文本分析与语言数据处理的完整流程,适用于内容分析、舆情监测与智能文本应用场景。

6

2026.01.27

拼多多赚钱的5种方法 拼多多赚钱的5种方法
拼多多赚钱的5种方法 拼多多赚钱的5种方法

在拼多多上赚钱主要可以通过无货源模式一件代发、精细化运营特色店铺、参与官方高流量活动、利用拼团机制社交裂变,以及成为多多进宝推广员这5种方法实现。核心策略在于通过低成本、高效率的供应链管理与营销,利用平台社交电商红利实现盈利。

104

2026.01.26

edge浏览器怎样设置主页 edge浏览器自定义设置教程
edge浏览器怎样设置主页 edge浏览器自定义设置教程

在Edge浏览器中设置主页,请依次点击右上角“...”图标 > 设置 > 开始、主页和新建标签页。在“Microsoft Edge 启动时”选择“打开以下页面”,点击“添加新页面”并输入网址。若要使用主页按钮,需在“外观”设置中开启“显示主页按钮”并设定网址。

12

2026.01.26

苹果官方查询网站 苹果手机正品激活查询入口
苹果官方查询网站 苹果手机正品激活查询入口

苹果官方查询网站主要通过 checkcoverage.apple.com/cn/zh/ 进行,可用于查询序列号(SN)对应的保修状态、激活日期及技术支持服务。此外,查找丢失设备请使用 iCloud.com/find,购买信息与物流可访问 Apple (中国大陆) 订单状态页面。

102

2026.01.26

npd人格什么意思 npd人格有什么特征
npd人格什么意思 npd人格有什么特征

NPD(Narcissistic Personality Disorder)即自恋型人格障碍,是一种心理健康问题,特点是极度夸大自我重要性、需要过度赞美与关注,同时极度缺乏共情能力,背后常掩藏着低自尊和不安全感,影响人际关系、工作和生活,通常在青少年时期开始显现,需由专业人士诊断。

5

2026.01.26

windows安全中心怎么关闭 windows安全中心怎么执行操作
windows安全中心怎么关闭 windows安全中心怎么执行操作

关闭Windows安全中心(Windows Defender)可通过系统设置暂时关闭,或使用组策略/注册表永久关闭。最简单的方法是:进入设置 > 隐私和安全性 > Windows安全中心 > 病毒和威胁防护 > 管理设置,将实时保护等选项关闭。

6

2026.01.26

2026年春运抢票攻略大全 春运抢票攻略教你三招手【技巧】
2026年春运抢票攻略大全 春运抢票攻略教你三招手【技巧】

铁路12306提供起售时间查询、起售提醒、购票预填、候补购票及误购限时免费退票五项服务,并强调官方渠道唯一性与信息安全。

105

2026.01.26

个人所得税税率表2026 个人所得税率最新税率表
个人所得税税率表2026 个人所得税率最新税率表

以工资薪金所得为例,应纳税额 = 应纳税所得额 × 税率 - 速算扣除数。应纳税所得额 = 月度收入 - 5000 元 - 专项扣除 - 专项附加扣除 - 依法确定的其他扣除。假设某员工月工资 10000 元,专项扣除 1000 元,专项附加扣除 2000 元,当月应纳税所得额为 10000 - 5000 - 1000 - 2000 = 2000 元,对应税率为 3%,速算扣除数为 0,则当月应纳税额为 2000×3% = 60 元。

29

2026.01.26

oppo云服务官网登录入口 oppo云服务登录手机版
oppo云服务官网登录入口 oppo云服务登录手机版

oppo云服务https://cloud.oppo.com/可以在云端安全存储您的照片、视频、联系人、便签等重要数据。当您的手机数据意外丢失或者需要更换手机时,可以随时将这些存储在云端的数据快速恢复到手机中。

82

2026.01.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
SQL 教程
SQL 教程

共61课时 | 3.6万人学习

Java 教程
Java 教程

共578课时 | 51.3万人学习

oracle知识库
oracle知识库

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号