oracle--视图、序列、索引

--视图

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

--就是都sql语句的封装,简化数据操作

一、简单视图

创建简单视图

select * from t_owners where ownertypeid = 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 = 1

--带检查约束的视图

根据地址表t_account 创建视图,内容为区域id=2的记录

create view view_account2 as

select * from t_address where areaid = 2

with check option

select * from view_account2

--只读视图只可以看,不能修改,or replace如果存在就覆盖

create or replace view view_owners1

select * from t_owners where ownertypeid =1

with only read

--创建带错误的视图,先建立语句,随后再建立表的情况

create force view view_test as select * from t_test

--复杂视图--多表关联

----多表视图关联不允许同时/直接修改多张表,只能改驱动主表的字段,从表一般不能改,不能改关联表字段

create view view_owners3 as

select * from t_owners ow,t_ownertype ot where ow.ownertypeid = ot.id

查询

select * from view_owners3 where ow.id >3

--聚合统计的复杂视图

--为什么要加别名:直接执行查询时,结果是一次性、临时的结果集,用完就消失了,视图不是临时结果,而是数据库里正式定义的虚拟表

--聚合函数形成的视图也是不能修改的

create view view_viewsum1 as

select year,month,sum(money)money from t_account group by year,month order by year,month

select * from view_viewsum1

二、物化视图

语法

create materialized view view_name

(build immediate | build deferrable)

默认是build immediate立刻有数据

refresh fast\|complete\|force

[

oncommit\|demand|start with (start_time) next(next_time)

]as

--物化视图与普通视图区别是,物化视图将查询语句的结果存储到一个物化视图,会建立副本,类似一张表,

-- complete 完全刷新

-- fast 增量刷新

-- force 自动选择

-- on commit 在基表做提交操作是刷新物化视图

-- on demand 手动刷新

--创建手动刷新的物化视图

create materialized view mv_add as

select ad.id,ad.name,ar.name arname from t_address ad,t_area ar where ad.areaid =ar.id

select * from mv_add

向基表插入数据

select * from t_address

insert into t_address values(8,'测试数据1',2,2)

此时物化视图mv_add是没有最新插入的数据的,可以执行下列语句来刷新

begin

DBMS_MVIEW.refresh('MV_ADD','C');

end;

也可以在命令窗口写EXEC DBMS_MVIEW.refresh('MV_ADD','C')

--自动刷新,refresh on commit --基表发生commit操作,自然刷新物化视图,refresh on commit

create materialized view mv_add2

refresh

on commit

as

select ad.id,ad.name,ar.name arname from t_address ad,t_area ar where ad.areaid =ar.id

select * from mv_add2

向基表插入数据

select * from t_address

insert into t_address values(9,'测试数据2',2,2);

commit;

select * from mv_add2

--创建不立即生成数据的物化视图 build deferred

--第一次必须手动执行刷新

create materialized view mv_add3

build deferred

refresh

on commit

as

select ad.id,ad.name,ar.name arname from t_address ad,t_area ar where ad.areaid =ar.id

select * from mv_add3

begin

DBMS_MVIEW.refresh('MV_ADD','C');

end

--创建增量刷新的物化视图

--必须首先创建物化视图日志,记录了基表发生了哪些变化,用记录去更新物化视图,这个rowid可以是表的主键,作为依据

create materialized view log on t_address with rowid;

create materialized view log on t_area with rowid;

--创建物化视图中的语句,必须有基表的表示rowid

create materialized view mv_add4

refresh fast

as

select ad.rowid adrowid,ar.rowid arrowid,ad.id,ad.name,ar.name arname from t_address ad,t_area ar where ad.areaid =ar.id

insert into t_address values(19,'测试数据3',2,2);

commit;

--手动刷新才会更新

select * from mv_add4

begin

DBMS_MVIEW.refresh('MV_ADD4','C');

end;

三、序列

--序列,是oracle提供用于产生一系列唯一数字的数据库对象

create sequence 序列名称

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

nextval 返回序列的下一个值

currval 返回序列的当前值

--创建简单序列

create sequence text;

--查询当前值

select text.currval from dual

--查询下一个值

select text.nextval from dual

--创建复杂序列

语法

create seqence xxx //创建序列名称

increment by n//递增的序列值是n,如果n是正整数就递增,负数就递减,默认是1

start with n //开始的值,默认递增是minvalue 递减是maxvalue

{maxvalue n \| nomaxvalue} //最大值

{minvalue n \| nominvalue} //最小值

{cycle \| nocycle}//循环/不循环

{cache n \| nocache}//分配并存储到内存中

--有最大的非循环序列

create sequence seq_text1

maxvalue 10;

--查询第十一次就会报错

select seq_text1.nextval from dual

--最大值100,从第10个开始,每次增长10个

create sequence seq_text2

increment by 10

maxvalue 100

start with 10;

select seq_text2.nextval from dual

--循环的序列

--Oracle 循环序列必须保证「最大值 + 步长」能回退到最小值且继续生成有效值;

create sequence seq_text3

increment by 10

maxvalue 210

start with 10

minvalue 10

cycle;

select seq_text3.nextval from dual

--修改和删除序列

使用alter sequence语句修改序列,不能更改序列的start with参数

alter sequence 序列名称 maxvalue 5000 cycle;

--删除序列

drop sequence 序列名称

四、同义词

实质上就是指定方案对象的一个别名

语法:create public SYNONYM synoonym for object

synonym表示要创建同义词的别名,object 表示表,视图,序列等对象

--私有同义词(别的数据库用户不能访问该同义词)

为表t_ownerss创建私有同义词 名称为owners

create synonym owners for t_owners;

select * from owners

--公有同义词

create public synonym owners2 for t_owners;

五、索引

用于加速存取的数据对象,合理的使用索引可以大大降低i/o次数,从而提高数据访问性能 ,类似于目录、树

--普通索引

create index index_owner_name on t_owners(name)

--唯一索引

在某个表创建某个列索引,而这列的值是不会重复的,就可以创建唯一索引,可以保证数据的唯一性

create unique index index_owners_meter on t_owners(watermetter);

--复合索引

经常对某几列进行查询,建立复合索引,基于两个以上的列来建立索引

create index index_owners_ah on t_owners(addressid,housenumber);

--反向键索引(转二进制然后数字反过来)

当某个字段的值为连续增长的值,如果构建标准索引,会形成歪脖子树,这样会增加查询的层数,性能会下降,建立反向键索引可以让值变得不规律,从而使索引数能均匀分布

create index index_owner_name on t_owners(name) reverse

--位图索引

相当于创建了图片, 只能用等号来进行查询

适合创建在低基数列上

不直接存rowid,而是存储字节位到rowid的映射

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

--索引失效

ALTER INDEX 索引名 UNUSABLE;

--删除索引

删除前先看表中有哪些索引

SELECT INDEX_NAME FROM USER_INDEXES WHERE TABLE_NAME = '表名';

DROP INDEX 索引名;

--重建索引

ALTER INDEX 索引名 REBUILD;

相关推荐
jiayou6417 小时前
KingbaseES 表级与列级加密完全指南
数据库·后端
GBASE2 天前
G术时刻 |GBase 8s数据库事务并发控制之封锁技术介绍(下)
数据库
xiezhr2 天前
逛GitHub发现了一款免费的带AI功能的数据库管理工具
数据库·ai编程·dba
吃糖的小孩3 天前
给 QQ AI 机器人设计“可控记忆”:会话摘要、手动长期记忆与角色卡边界
数据库
笃行3504 天前
金仓数据库数据安全双防线:静态存储加密与传输加密实战
数据库
笃行3504 天前
金仓数据库物理备份实战:sys_rman 全流程演练与误覆盖抢救
数据库
笃行3504 天前
金仓数据库逻辑备份实战:从全库导出到 Schema 替换的完整闭环
数据库
SelectDB5 天前
阶跃星辰基于 SelectDB 构建 PB 级 Agent 可观测平台
大数据·数据库·aigc
这个DBA有点耶5 天前
GROUP BY优化全解:如何写出既不丢数据又飞快的分组查询
数据库·mysql·架构