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]

on\[commit\|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;

相关推荐
fire-flyer2 小时前
ClickHouse系列(二):MergeTree 家族详解
大数据·数据库·clickhouse
w6100104662 小时前
CKA-2026-StorageClass
linux·运维·服务器·cka·storageclass
Yana.nice2 小时前
MySQL 三大日志(redo log、undo log、binlog)的区别和作用
数据库·mysql
XDHCOM2 小时前
MySQL CASE WHEN语句应用实例:如何实现条件查询与数据转换?
数据库·mysql
Meaauf2 小时前
VMware五种网络模式详解与EVE-NG互联指南
运维·服务器·网络
吕司2 小时前
Linux线程同步
linux·服务器·开发语言
Jul1en_2 小时前
【Redis】常用命令及定时器实现思想
数据库·redis·缓存
杰克尼3 小时前
redis(day02-短信登录)
数据库·redis·缓存
知识分享小能手3 小时前
MongoDB入门学习教程,从入门到精通,MongoDB的分片管理(17)
数据库·学习·mongodb