oracle视图 序列 索引的创建

本文详细介绍了数据库中的视图、物化视图、序列和同义词。视图是基于查询结果的虚拟表,提供数据安全性和简化操作;物化视图是存储查询结果的物理表,提高查询效率;序列用于生成唯一数值,常用于自动增长的列;同义词是对象的别名,增强安全性并简化SQL语句。文章还涵盖了这些对象的创建、修改和删除方法,以及各种使用场景和最佳实践。
摘要由CSDN通过智能技术生成

一. 视图

1.1 什么是视图

      视图是一种数据库对象,是从一个或者多个数据表或视图中导出的虚表,视图所对应的数据并不真正地存储在视图中,
      而是存储在所引用的数据表中,视图的结构和数据是对数据表进行查询的结果。
      根据创建视图时给定的条件,视图可以是一个数据表的一部分,也可以是多个基表的联合,
      它存储了要执行检索的查询语句的定义,以便在引用该视图时使用。

使用视图的优点:

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

  视图可以包含视图

1.2 创建或修改视图语法

	CREATE [OR REPLACE] [FORCE] VIEW 表名   
		AS subquery   
		[WITH CHECK OPTION ]   
		[WITH READ ONLY] 
	
	选项解释: 		 
		OR REPLACE 			:若所创建的试图已经存在,ORACLE 自动重建该视图; 
		FORCE      			:不管基表是否存在 ORACLE都会自动创建该视图; 
		subquery    	 	:一条完整的 SELECT 语句,可以在该语句中定义别名; 
		WITH  CHECK  OPTION :插入或修改的数据行必须满足视图定义的约束;
								不能修改视图生成时,where条件中的列
		WITH READ ONLY 		:该视图上不能进行任何 DML 操作。 
	
3.删除视图语法 
	DROP  VIEW 表名  
	
4.案例
	a)简单视图的创建与使用 
		1.什么是简单视图?如果视图中的语句只是单表查询,并且没有聚合函数,我们就称之为简单视图。 
		2.对于简单视图,可以查询,增删改记录。(把视图看做一张表进行操作)
		3.视图是一个虚拟的表,数据来自于表。
			(1)如果更改了视图的数据,表的数据也自然会变化,
			(2)更改了表的数据,视图也自然会变化。
			(3)一个视图所存储的并不是数据,而是一条 SQL语句。 	
		
	b) 带检查约束的视图 
		create or replace view view_address2 as 
		select * from T_ADDRESS 
		where areaid=2 
		with check option 
		
		*不能修改视图生成时,where条件中的列
		
	c)只读视图:只能读取
	
	d)创建带错误的视图 
			如果视图的 SQL 语句所设计的表并不存在,会创建失败
			
			有的时候,我们创建视图时的表可能并不存在,但是以后可能会存在,我们如果
		此时需要创建这样的视图,需要添加 FORCE 选项,SQL语句如下: 
		create or replace FORCE view view_TEMP as select * from T_TEMP 
	
	f)复杂视图的创建与使用 
		视图的SQL语句中,有聚合函数或多表关联查询。 
		(1)多表关联查询的例子 
			键保留表的字段是可以更新的,而非键保留表是不能更新的
			什么叫键保留表呢? 
				键保留表是理解连接视图修改限制的一个基本概念。
					该表的主键列全部显示在视图中,并且它们的值在视图中都是唯一且非空的。
				也就是说,表的键值在一个视图中也是键值,那么就称这个表为键保留表。 
		
			***持有外键的那张表是键保留表
			
		(2)分组聚合统计 
			聚合统计视图是没有键保留表的,并且只能读取

二. 物化视图

2.1 什么是物化视图

    视图是一个虚拟表(也可以认为是一条语句),基于它创建时指定的查询语句返回的结果集。每次访问它都会导致
    这个查询语句被执行一次。为了避免每次访问都执行这个查询,可以将这个查询结果集存储到一个物化视图(也叫实体化视图)。
    物化视图与普通的视图相比的区别是物化视图是建立的副本,它类似于一张表,需要占用存储空间。
    而对一个物化视图查询的执行效率与查询一个表是一样的。

2.2 创建物化视图语法

	CREATE  MATERIALIZED VIEW view_name
		[BUILD IMMEDIATE  | BUILD DEFERRED ]
		REFRESH [FAST|COMPLETE|FORCE]  
		[  ON [COMMIT |DEMAND ] | START WITH (start_time) NEXT (next_time)  ]  
		AS subquery  
	a)BUILD 
		BUILD IMMEDIATE 是在创建物化视图的时候就生成数据  
		BUILD DEFERRED  则在创建时不生成数据,以后根据需要再生成数据。 
		默认为 BUILD IMMEDIATE。 
	
	b)REFRESH:										//怎么刷新
		指当基表发生了 DML操作后,物化视图何时采用哪种方式和基表进行同步。 
		 REFRESH 后跟着指定的刷新方法有三种:FAST、COMPLETE、FORCE。
		 
		 FAST		:刷新采用增量刷新,只刷新自上次刷新以后进行的修改。
		 COMPLETE 	:刷新对整个物化视图进行完全的刷新。
		 FORCE		:则 Oracle在刷新时会去判断是否可以进行快速刷新,如果可以则采用 FAST 方式,否则采用 COMPLETE
					的方式。
					FORCE 是默认的方式。
					执行fast需要建立日志
	c)刷新的模式有两种:ON DEMAND 和 ON COMMIT//在什么时候刷新
		ON DEMAND 指需要手动刷新物化视图(默认)。
		ON COMMIT 指在基表发生 COMMIT 操作时自动刷新。 
		
	d)创建手动刷新的物化视图 
		需求:查询地址 ID,地址名称和所属区域名称
		create materialized view mv_address   as 
			select ad.id,ad.name adname,ar.name ar_name  
			from t_address ad,t_area ar 
			where ad.areaid=ar.id 
			
		1.手动刷新物化视图: 
			begin 
				DBMS_MVIEW.refresh('MV_ADDRESS','C');
			end; 
		2.在命令SQL窗口刷新
			EXEC DBMS_MVIEW.refresh('表名','C');   //'C':是COMPLETE的缩写
		
	e).创建时不生成数据的物化视图 
		create materialized view mv_address3 
			build deferred  
			refresh on commit 
			as select ad.id,ad.name adname,ar.name ar_name  
			from t_address ad,t_area ar  where ad.areaid=ar.id; 
		
		**创建时不生成数据时候,第一查询要手动刷新

	f)创建增量刷新的物化视图 
			创建增量刷新的物化视图,必须要有物化视图日志:记录基表发生了那些变化,(提交之后会清空日志)用这些记录去更新物化视图
		创建物化视图中的语句中,with后面关联的列,基表中必须有
		
		**如果创建增量刷新的物化视图,必须首先创建物化视图日志 
			eg: create materialized view log on t_address with rowid;
				create materialized view log on t_area with rowid 
		 
		创建的物化视图日志名称为 MLOG$_表名称 
		
		注意:创建增量刷新的物化视图,必须: 
			1. 创建物化视图中涉及表的物化视图日志。 
			2. 在查询语句中,必须包含所有表的 rowid ( 以 rowid方式建立物化视图日志 ) 
		

	g)删除物化视图
		drop materialized view 表名

三. 序列

1.什么事序列
	序列是 ORACLE 提供的用于产生一系列唯一数字的数据库对象。 
	
2.创建与使用序列  //序列也是个伪列
	create sequence 序列名
	
	通过序列的伪列来访问序列的值 
		NEXTVAL 返回序列的下一个值 
		CURRVAL 返回序列的当前值 

	提取下一个值  
		select 序列名称.nextval from dual 
	提取当前值 
		select 序列名称.currval from dual 
	
	注意:我们在刚建立序列后,无法提取当前值,只有先提取下一个值时才能再次提取当前值。 
	
3.创建复杂序列 
	语法: 
	CREATE SEQUENCE sequence  //创建序列名称 
		   [INCREMENT BY n]  //递增的序列值是n 如果n是正数就递增,如果是负数就递减 默认是 1 
		   [START WITH n]    //开始的值,递增默认是 minvalue 递减是 maxvalue 
		   [{MAXVALUE n | NOMAXVALUE}] //最大值 
		   [{MINVALUE n | NOMINVALUE}] //最小值 
		   [{CYCLE | NOCYCLE}] //循环/不循环 
		   [{CACHE n | NOCACHE}];//分配并存入到内存中 	
				默认为20,默认cache,一次从磁盘中拿出20,存储到内存中,用完后们再次从硬盘中拿取数据
4.案例
	a)循环的序列,第一次循环是从开始值开始循环,而第二次循环是从最小值开始循环。 
	b)循环的序列必须指定最大值
	c)带缓存的序列 
		我们执行下列语句: 
		create sequence seq_test3 
			increment by 10 
			start with 10 
			maxvalue 501 
			minvalue 5 
			cycle  
			cache 50; 
	
		***缓存设置的数必须小于每次循环的数
	
	视图和物化视图的区别?  
		视图是一张虚拟的表:视图可以封装一些数据,把数据隐藏起来,只给使用者看到一部分信息,(信息安全),简化sql语句
		物化视图:创建一个具体的表,提高查询速度
		
	为什么要用序列?  :oracle中没有自动增长,我们插入表的时候要从序列中取值.
	同义词有多什么作用 :操作同义词和操作它本身是一致的.
		private的具有dba权限的用户可以通过表名.同义词查询,所有用户公共的都可以访问
		
5.修改和删除序列 
	修改序列:使用 ALTER SEQUENCE 语句修改序列,不能更改序列的 START WITH 参数 
		ALTER SEQUENCE 序列名称 MAXVALUE 5000 CYCLE; 
	删除序列: 
		DROP SEQUENCE 序列名称; 		

四. 同义词

4.1 什么是同义词

    同义词实质上是指定方案对象的一个别名。同义词可以提供一定程度的安全性。同时,同义词的易用性较好,降低了数据库用户的 SQL语句复杂度。

4.2 创建与使用同义词

create [public] SYNONYM synooym for object; 

其中 synonym表示要创建的同义词的名称,
object表示表,视图,序列等我们要创建同义词的对象的名称

1.私有同义词  
	create synonym OWNERS for T_OWNERS; 
2.2.公有同义词 
	create public synonym OWNERS2 for T_OWNERS; 

五. 索引 (查询快)

5.1 什么是索引

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

    索引是需要占据存储空间的,也可以理解为是一种特殊的数据。形式类似于下图的一棵“树”,而树的节点存储的就是每条记录的物理地址,也就是我们提到的伪列(ROWID)

5.2 普通索引

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

5.3 唯一索引

    如果我们需要在某个表某个列创建索引,而这列的值是不会重复的。这是我们可以创建唯一索引。

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

5.4 复合索引

应用场景: 经常要对某几列进行查询进行查询时使用

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

5.5 反向键索引

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

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

5.6 位图索引

使用场景: 位图索引适合创建在低基数列上 ,也就是列中的内容确定且不多的情况下
优点: 减少响应时间,节省空间占用

	create bitmap index 索引名称 on 表名(列名); 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值