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