【Oracle】数据库对象

一、视图

1、视图概述

视图是一种数据库对象

视图 => 封装sql语句 => 虚拟表

2、视图的优点
  1. 简化操作:视图可以简化用户处理数据的方式。
  2. 着重于特定数据:不必要的数据或敏感数据可以不出现在视图中。
  3. 视图提供了一个简单而有效的安全机制,可以定制不同用户对数据的访问权限。
  4. 提供向后兼容性:视图使用户能够在表的架构更改时为表创建向后兼容接口。
3、视图的创建与修改
CREATE [OR REPLACE] [FORCE] VIEW view_name 
AS subquery 
[WITH CHECK OPTION ] 
[WITH READ ONLY]
  • OR REPLACE :若所创建的试图已经存在,ORACLE 自动重建该视图
  • FORCE :不管基表是否存在, ORACLE 都会自动创建该视图
  • subquery :一条完整的 SELECT 语句,可以在该语句中定义别名
  • WITH CHECK OPTION :插入或修改的数据行必须满足视图定义的约束
  • WITH READ ONLY :该视图上不能进行任何 DML 操作
4、视图的删除
DROP VIEW view_name
5、案例
1)简单视图

简单视图:视图中的语句只是单表查询,并且没有聚合函数

-- 创建简单视图
CREATE VIEW view_owners1 AS
SELECT * FROM T_OWNERS WHERE ownertypeid=1-- 查询
select * from view_owners1 where addressid=1-- 更新
update view_owners1 set name='王刚' where id=2

视图其实是一个虚拟的表,它的数据其实来自于表。

如果更改了视图的数据,表的数据也自然会变化,更改了表的数据,视图也自然会变化。

一个视图所存储的并不是数据,而是一条 SQL语句。

2)带检查约束的视图
create view view_address2 as
select * from T_ADDRESS where areaid=2
with check option
-- 无法修改的条件:因为视图的条件是areaid=2
update view_address2 set areaid=1 where id=4

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3)只读视图
create or replace view view_owners1 as
select * from T_OWNERS where ownertypeid=1
with read only

尝试执行修改操作:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4)带错误的视图

我们创建一个视图,如果视图的 SQL 语句所设计的表并不存在

CREATE FORCE VIEW view_TEMP AS 
SELECT * FROM T_TEMP

用途:表会运行时产生

5)复杂视图
1. 多表关联查询

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

-- 创建复杂视图
CREATE VIEW view_owners AS 
SELECTo.id 业主编号,o.name 业主名称,ot.name 业主类型 
FROMT_OWNERS o,T_OWNERTYPE ot 
WHEREo.ownertypeid = ot.id-- 查询复杂视图
select * from view_owners-- 修改复杂视图
update view_owners set 业主名称='范小冰' where 业主编号=1;

只能修改**键保留表(主键所在的那个表)**的数据

2. 分组聚合统计查询
-- 创建视图,按年月统计水费金额
create view view_accountsum as
select year,month,sum(money) moneysum 
from T_ACCOUNT 
group by year,month
order by year,month

此例用到聚合函数,没有键保留表,所以无法执行 update

二、物化视图

1、物化视图概述

物化视图与普通的视图相比的区别是物化视图是建立的副本。

  • 优点:查询效率高
  • 缺点:占用存储空间
2、物化视图创建
CREATE METERIALIZED VIEW view_name
[BUILD IMMEDIATE | BUILD DEFERRED]
REFRESH [FAST|COMPLETE|FORCE] 
[
ON [COMMIT | DEMAND ] | START WITH (start_time) NEXT
(next_time)
]
AS
subquery
  • BUILD IMMEDIATE :在创建物化视图的时候就生成数据
  • BUILD DEFERRED :在创建时不生成数据,以后根据需要再生成数据(默认为BUILD IMMEDIATE
  • REFRESH:刷新,指当基表发生了 DML 操作后,物化视图何时采用哪种方式和基表进行同步
    • FAST增量刷新,通过日志修改
    • COMPLETE完全刷新,每次修改之后重新生成
    • FORCE自动选择,判断是否可以进行快速刷新,如果可以则采用 FAST 方式,否则采用 COMPLETE的方式(FORCE 是默认的方式)
  • 刷新的模式
    • ON DEMAND :需要手动刷新物化视图(默认)
    • ON COMMIT :基表发生 COMMIT 操作时自动刷新
3、物化视图创建
drop materialized view view_address1
4、案例
1)手动刷新
-- 创建手动刷新的物化视图
CREATE MATERIALIZED VIEW mv_address 
AS 
SELECTad.id,ad.name ad_name,ar.name ar_name 
FROMt_address ad,t_area ar 
WHEREad.areaid = ar.id-- 查询物化视图
select * from mv_address

手动刷新物化视图

-- 1、PL/SQL
BEGINDBMS_MVIEW.refresh ( 'MV_ADDRESS', 'C' );
END;
### 2、sql命令窗口
EXEC DBMS_MVIEW.refresh('MV_ADDRESS','C');

c:COMPLETE,完全刷新

2)自动刷新
-- 创建自动刷新的物化视图
CREATE MATERIALIZED VIEW mv_address2 
refresh 
ON commit 
AS 
SELECTad.id,ad.name ad_name,ar.name ar_name 
FROMt_address ad,t_area ar 
WHEREad.areaid = ar.id
3)不生成数据

第一次必须手动刷新,之后(ON commit)会自动刷新

-- 创建不生成数据的物化视图
CREATE MATERIALIZED VIEW mv_address3 
build deferred
refresh 
ON commit 
AS 
SELECTad.id,ad.name ad_name,ar.name ar_name 
FROMt_address ad,t_area ar 
WHEREad.areaid = ar.id;
4)增量刷新

物化视图日志:记录基表发生了哪些变化,用这些记录去更新物化规图

如果创建增量刷新的物化视图,必须首先创建物化视图日志

-- 创建物化视图日志
create materialized view log on t_address with rowid;
create materialized view log on t_area with rowid;

创建的物化视图日志名称为 MLOG$_表名称

CREATE MATERIALIZED VIEW mv_address4 
refresh fast 
AS 
SELECTad.ROWID adrowid,ar.ROWID arrowid,ad.id,ad.name adname,ar.name ar_name 
FROMt_address ad,t_area ar 
WHEREad.areaid = ar.id;

创建增量刷新的物化视图的条件:

  1. 创建物化视图中涉及表的物化视图日志
  2. 在查询语句中,必须包含所有表的 rowid(以 rowid 方式建立物化视图日志)

当我们手动刷新物化视图后,物化视图日志被清空,物化视图更新。

三、序列

1、序列概述

序列是 ORACLE 提供的用于产生一系列唯一数字的数据库对象。

类似于mysql的自动增长

2、简单序列
-- 创建序列
create sequence 序列名称

通过序列的伪列来访问序列的值

  • NEXTVAL:返回序列的下一个值
  • CURRVAL:返回序列的当前值

我们在刚建立序列后,无法提取当前值,只有先提取下一个值时才能再次提取当前值。

-- 提取下一个值
select 序列名称.nextval from dual-- 提取当前值
select 序列名称.currval from dual
3、复杂序列
-- 创建序列名称
CREATE SEQUENCE sequence
-- 递增的序列值是 n 如果 n 是正数就递增,如果是负数就递减,默认是 1
[INCREMENT BY n]
-- 开始的值,递增默认是 minvalue 递减是 maxvalue
[START WITH n]
-- 最大值
[{MAXVALUE n | NOMAXVALUE}]
-- 最小值
[{MINVALUE n | NOMINVALUE}]
-- 循环/不循环
[{CYCLE | NOCYCLE}]
-- 分配并存入到内存中
[{CACHE n | NOCACHE}];
4、修改序列

修改序列:使用 ALTER SEQUENCE 语句修改序列,不能更改序列的 START

ALTER SEQUENCE 序列名称 MAXVALUE 5000 CYCLE;
5、删除序列
DROP SEQUENCE 序列名称;
6、案例
1)有最大值的非循环序列
create sequence seq_test1 
increment by 10
start with 10
maxvalue 300
minvalue 5;

当序列值为最大值的时候再次提取值,系统会报异常信息。

2)有最大值的循环序列
create sequence seq_test2
increment by 10
start with 10
maxvalue 300
minvalue 5
cycle;

第一次循环是从开始值开始循环,而第二次循环是从最小值开始循环

3)带缓存的序列
create sequence seq_test5
increment by 10
start with 10
maxvalue 500
minvalue 9
cycle
cache 50;

四、同义词

1、同义词概述

指定方案对象的一个别名

2、同义词的创建与使用
create [public] SYNONYM synooym for object;
  • synonym :要创建的同义词的名称
  • object :表,视图,序列等要创建同义词的对象的名称
  • public
    • 私有同义词:只有当前用户能用
    • 公有同义词:所有的用户都可以使用
3、案例
1)私有同义词
-- 创建私有同义词
create synonym OWNERS for T_OWNERS;-- 使用私有同义词
select * from OWNERS;
2)公有同义词

以另外的用户登陆,也可以使用公有同义词

-- 创建公有同义词
create public synonym OWNERS2 for T_OWNERS;-- 使用公有同义词
select * from OWNERS2;

五、索引

1、索引概述

相当于书的目录、字典的索引

索引是需要占据存储空间的,也可以理解为是一种特殊的数据。形式类似于一棵"树"。

树的节点存储的就是每条记录的物理地址,也就是我们提到的伪列ROWID

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 优点:查询效率高
  • 缺点:占用存储空间
2、普通索引
create index 索引名称 on 表名(列名);
3、唯一索引

如果索引列的值是不会重复的,可以创建唯一索引。

create unique index 索引名称 on 表名(列名);
4、复合索引

基于两个以上的列建立一个索引

create index 索引名称 on 表名(列名,列名.....);
5、反向键索引

当某个字段的值为连续增长的值,如果构建标准索引,会形成歪脖子树。会增加查询的层数,性能会下降。

建立反向键索引,可以使索引的值变得不规则,从而使索引树能够均匀分布。

create index 索引名称 on 表名(列名) reverse;
6、位图索引

位图索引适合创建在低基数列上 。

位图索引不直接存储 ROWID,而是存储字节位到 ROWID 的映射。

减少响应时间,节省空间占用。

create bitmap index 索引名称 on 表名(列名);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/341504.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++标准学习--多线程

在以往多线程的实现的时候,都是自己去亲自创建线程,采用特殊flag 及锁控制线程的运转状态。这无可厚非,但又似乎有重复造轮子的嫌疑。最近发现了一个线程池的轮子,很不错,ZZ一下。 C多线程线程池(全详解&a…

使用numpy处理图片——90度旋转

在《使用numpy处理图片——镜像翻转和旋转》一文中,我们介绍了如何将图片旋转的方法。本文将使用更简单的方法旋转图片90度。 左旋转90度 import numpy as np import PIL.Image as Imagedata np.array(Image.open(the_starry_night.jpg))# left 90 rot90LeftWith…

GPT Store开业大吉:一场AI技术与创新的盛宴

就在1.11 日,ChatGPT 正式上线 GPT Store ! OpenAI CEO 山姆奥特曼第一时间确认了这个消息: 自从GPTs的概念提出以来,短短两个月内,全球用户已经创造了超过300万个GPTs。 点击 GPT Store 或者进入ChatGpt页面&am…

李沐之经典卷积神经网络

目录 1. LeNet 2. 代码实现 1. LeNet 输入是32*32图片,放到一个5*5的卷积层里面,卷积层的输出通道数是6,高宽都是28(32-5128)。再经过2*2的池化层,把28*28变成14*14(28-22)/214&am…

python高校舆情分析系统+可视化+情感分析 舆情分析+Flask框架(源码+文档)✅

毕业设计:2023-2024年计算机专业毕业设计选题汇总(建议收藏) 毕业设计:2023-2024年最新最全计算机专业毕设选题推荐汇总 🍅感兴趣的可以先收藏起来,点赞、关注不迷路,大家在毕设选题&#xff…

Python——python练习题

1.小明身高1.75,体重80.5kg。请根据BMI公式(体重除以身高的平方)帮小明计算他的BMI指数,并根据BMI指数: 低于18.5:过轻 18.5-25:正常 25-28:过重 28-32:肥胖 高于32&…

如何从多个文件夹里各提取相应数量的文件放一起到新文件夹中形成多文件夹组合

首先,需要用到的这个工具: 百度 密码:qwu2蓝奏云 密码:2r1z 说明一下情况 文件夹:1、2、3里面分别放置了各100张动物的图片,模拟实际情况的各种文件 操作:这里演示的是从3个文件夹里各取2张图…

kafka下载安装部署

Apache kafka 是一个分布式的基于push-subscribe的消息系统,它具备快速、可扩展、可持久化的特点。它现在是Apache旗下的一个开源系统,作为hadoop生态系统的一部分,被各种商业公司广泛应用。它的最大的特性就是可以实时的处理大量数据以满足各…

Flink异步IO

本文讲解 Flink 用于访问外部数据存储的异步 I/O API。对于不熟悉异步或者事件驱动编程的用户,建议先储备一些关于 Future 和事件驱动编程的知识。 本文代码gitee地址: https://gitee.com/ddxygq/BigDataTechnical/blob/main/Flink/src/main/java/operator/AsyncIODemo.java …

【libpcap】获取报文pcap的ns级别的时间戳

1.安装libpcap 首先&#xff0c;下载最新的 libpcap 源代码。你可以从 tcpdump.org 获取最新版本 1 解压下载的libpcap tar -zxvf libpcap-version.tar.gz 2 进入解压目录进行安装 cd libpcap-version ./configure make sudo make install2 解析报文时间戳 #include <pca…

第11章 GUI Page489~494 步骤三十 保存画板文件

为“保存”菜单项 MenuItemFileSave挂接事件响应函数&#xff1a; 实际运行时&#xff0c;现版TrySaveFile()函数有点儿傻&#xff0c;点击保存菜单&#xff0c;还会弹出对话框&#xff0c;问我们“要不要保存” 修改TrySaveFile()函数 函数声明修改为&#xff1a; 函数实现修…

工业以太网的网络安全与数据传输性能

工业以太网主要是一种用于工业控制系统的网络通信协议&#xff0c;它基于以太网技术&#xff0c;将其应用于工业环境中&#xff0c;以实现高速、可靠、安全的数据传输。跟传统的专用工业网络比较&#xff0c; 工业以太网具有更大的带宽、更低的成本以及更好的扩展性&#xff0c…