关于Oracle和PLSQL的学习记录7

mac2026-08-11  6

------索引与视图------ 索引提供对数据表的快速访问,视图给数据表提供了另外一种数据组织方式 1.创建唯一索引 唯一索引是指索引的键值不重复,为表上的某字段创建唯一索引时,应确定该字段没有null值,否则在使用的时候会经常出错;唯一索引可以确保索引列不包含重复的值,在多列唯一索引的情况下,该索引可以确保索引列中每个值组合都是唯一的 create unique index un_sno on stu(sno asc); 在实际应用中,唯一索引一般采取自动创建方式,即在定义主键约束或唯一约束时,Oracle系统自动在相应的约束列上建立唯一索引 索引名称有一定命名规则,唯一索引一般加上前缀UN_;此外,在一个表中应是唯一的,但在同一个数据库或不同数据库中可以重复

2.创建单列索引 单列索引是指索引基于单个列所创建 在数据库中,单列索引允许数据库通过搜索索引找到特定的值,然后跟随指针到达包含该值的行,而不必扫描整个数据库,从而快速访问数据库表中的特定信息 create index index_age on stu(sage desc); 索引创建后,Oracle显示的索引类型为FUNCTION-BASED NORMAL,其意义为B树索引,即索引按B树结构组织并存放索引数据

3.创建复合索引 复合索引也称为组合索引,是指索引项是多个索引,即在索引建立语句中同时包含多个列名;由于复合索引包含多个索引项目,能形成索引覆盖,因此能提高where语句的查询效率 create index index_snodept on stu(sno desc,sdept); 创建该索引后,在stu表上使用where sno= and sdept = 之类的select语句的查询效率将大大提高 符合索引的使用原则是第一个条件应该是复合索引的第一列,且复合索引的顺序一定要和查询语句中where子句后的条件顺序相同才有效;此外,如果数据表过大,则有些列不适合作为索引(比如字符型长度超过40的),如果表是经常需要更新的也不适合做索引 复合索引的引用需要满足较多的条件,既要包含条件,又要保证条件的顺序,因此复合索引不能替代多个单一索引

4.使用alter index重建索引 重命名 alter index index_snodept rename to index_snd; 合并 alter index index_snd coalesce; 重建 alter index index_snd rebuild; 重建索引实际上就是对原有的索引的删除,再重新建一个新的索引,而索引的名称不变 合并索引和重建索引都能消除索引碎片,其区别在于合并索引代价较低,无须额外存储空间,而重建索引恰恰相反

5.删除索引 当一个索引不再需要时,可以将其从数据库中删除,以回收它当前使用的磁盘空间,使数据库中的其他对象可以使用该空间 drop index index_snd; 在删除表的时候,所有基于该表的索引也会被自动删除,此外,如果索引中包含损坏的数据块,或者使索引碎片过多时,应该删除该索引,然后重建索引

6.创建简单视图 视图是用户按不同的数据组成形式对基本表中数据进行重新组织而得到的数据对象,视图的结构和内容是通过SQL查询获得的 视图可以被看成是虚拟表或存储查询 create view v_stu as select sno 学号,sname 姓名,sage 年龄,sdept 班级 from stu; 视图在数据库中存储的是select语句,也就是数据库里并没有存储视图这个表,而存储的是视图的定义,select语句的结果集构成视图所返回的虚拟表

7.创建复杂视图 create view v_grade as select stu.sno 学号,stu.sname 姓名,grade.cname 课程,grade.score 成绩 from stu inner join grade on stu.sno = grade.sno where stu.sdept='12计算机'; 视图创建完成后,可以使用"DESC+视图名"来查看视图的结构,通过“select * from 视图名”来查看视图中的所有数据记录,即可以检验该视图创建是否复合实例要求

8.创建基于视图的视图 create view v_grade1(姓名,课程,成绩) as select 姓名,课程,成绩 from v_grade; 视图v_grade1后面的列名不是必须的 有以下三种情况必须指定新试图的列: 当列是从算术表达式、函数或常量派生的 因为表的连接查询导致两个或更多的列可能会具有相同的名称 视图中的某列被赋予了不同于派生来源列的名称

使用create view语句创建视图时,select子句不能包含order by、into等子句,且不饿能引用临时表或表变量

9.通过视图插入数据 对视图进行的数据操作最终都是对基本表进行的数据操作 insert into v_stu(学号,姓名) values('120008','吴小华'); 在视图和基本表中同时插入了数据吴小华 在通过视图插入数据的时候,必须保证未显示的列有值,该值可以时默认值或者null 如果在创建视图时加上了参数with read only,则不能再对该视图进行数据插入、修改和删除操作

10.通过视图修改数据 update v_stu set 年龄=20,班级='12艺术设计' where 学号='120008'; 使用视图修改基本表中数据的原因之一就是视图的列名具有更好的描述性

11.通过视图删除数据 delete from v_stu where 姓名='吴小华'; 视图中的数据不是存放在视图中的,即视图没有相应的存储空间,对视图的一切操作最终都要转换成对基本表的操作,使用视图有如下几个主要的优点: 利于数据保密,可以为不同的用户定义不同的视图,使用户只能看到与自己有关的数据 简化查询操作,为复杂的查询建立一个视图,用户不必键入复杂的查询语句,只需要针对视图做简单的查询即可 保证数据的逻辑独立性,对于视图的操作只依赖于视图的定义,当构成视图的基本表要修改时,只需要修改视图定义的子查询部分,而基于视图的查询不用改变

通过视图删除基本表的数据时,视图的数据必须来源于一个单表

12.删除视图 drop view v_stu; 由于视图是一个虚表,因此删除的仅仅是视图的定义

13.创建同义词synonym 同义词是数据库对象(表、视图、序列、过程、函数、程序包等)的一个别名 create synonym mystu for system.stu; select sno,sname,sage,sgender,sbirth,sdept from mystu; 在Oracle数据库中使用同义词拥有以下的优势: 节省大量的数据库空间,对不同用户的操作同意张表没有多少差别 扩展了数据库的使用范围,能够在不同的数据库用户之间实现无缝交互 同义词可以创建在不同的数据库服务器上,同过网络事项连接

私有同义词(只能由当前用户使用)/公有同义词(可以被所有用户访问),默认为私有的 drop synonym mystu; 创建不同用户的数据对象同义词时,需要授权当前用户对这个数据对象的操作权限,否则操作该同义词时将返回错误提示

14.生成序列号 创建基本表时将自动创建一个值递增的列,这在Oracle中称为序列;序列用来生成连续的整数数据,常常作为主键中的增长列,序列中的数据可以升序生成,也可以降序生成 创建一个从1开始,默认最大值,每次增长1的序列,要求缓存中有30个预先分配好的序列号 create sequence stusq minvalue 1 start with 1 nomaxvalue increment by 1 cache 30; select stusq.nextval from dual; select stusq.currval from dual; 序列创建完成后,查询dual表的"序列名.CURRVAL"值将获得一个错误提示,此时当前值不可预见,应该先通过"序列名.NEXTVAL"获取第一个序列值

15.修改和注销序列 修改stusq序列,设置其最大值为1000,最小值为-1000 alter sequence stusq minvalue -1000 maxvalue 1000; 修改序列不能更改其start with参数 删除序列:drop sequence stusq;

16.创建表空间 表空间是Oracle用于存放海量数据、解决数据在不同平台上移植的统一存取格式的数据对象;在Oracle中,若干操作系统文件可以组成一个表空间,表空间统一管理空间中的数据文件,一个数据文件只能属于一个表空间,一个数据库空间由若干个表空间组成;Oracle中所有的数据(包括系统数据),全都保存在表空间中 创建一个表空间,包含两个数据文件,大小分别为10MB、5MB,要求Extent的大小统一为1M: create tablespace myspace datafile 'D:/a.ora' size 10M,'D:/b.ora' size 5M extent management local uniform size 1M; select * from dba_data_files; 只有管理员才能创建表空间

17.扩充和删除表空间 在创建表空间时需要考虑数据库对分区的管理,即Extent的大小管理;当一个表创建后先申请一个分区,在数据插入操作执行过程中,如果分区数据已满,就需要重新申请另外的分区 扩充 alter tablespace myspace add datafile 'D:/c.ora' size 10M; 创建表指定表空间: create table scores(   id number,   term varchar2(2),   stuid varchar2(7) not null,   examno varchar2(7) not null,   writtenscore number(4,1) not null,   labscore number(4,1) not null ) tablespace myspace; 删除表空间:drop tablespace myspace; 表空间被删除后,该控件中的ora数据文件并不会随之被删除

18.为用户指定表空间 创建一个tablebak用户,在创建的同时为其指定默认表空间为users create user tablebak indentified by oracle default tablespace users; create user创建用户,identified by指定用户的初始口令 dba_users视图是Oracle安装后自动创建的数据字典之一,其包含数据库实例中所有用户的信息

19.为表指定表空间 create table scores(   id number,   term varchar2(2),   stuid varchar2(7) not null,   examno varchar2(7) not null,   writtenscore number(4,1) not null,   labscore number(4,1) not null ) tablespace users; 可以通过对数据字典中的user_tables视图进行查询操作来实现 user_tables视图也是Oracle安装后自动创建的数据字典之一,其用于存储用户分配的表

20.为索引指定表空间 create index uq_id on scores(id) tablespace users; 可以通过数据字典中user_indexes视图进行查询 基本表和索引表等数据对象一旦创建完成后,表空间无法修改

21.查看索引个数和类别 select index_name,index_type,table_name from user_indexes order by table_name;

Oracle常用的数据字典分为3类: user_(对象名):记录用户对象的信息,如user_tables视图包含创建的所有表;user_views、user_constraints都属于此类 all_(对象名):记录用户对象的以及被授权访问的对象信息,如all_tables等 dba_(对象名):记录数据库实例的所有对象的信息,如dba_users包含数据库实例中所有用户的信息;一般来说,dba的信息包含user和all的信息

22.查看被索引的列 索引列信息没有存放在user_indexes数据字典中 select index_name,table_name,column_name from user_ind_columns where index_name = upper('index_sage'); 除了user_ind_columns视图外,Oracle还包含all_ind_columns和dba_ind_columns两个视图,通过查询user_ind_columns视图,可以确定哪些列在索引中,而dba_ind_columns视图列出了整个数据库的列以及索引信息

23.查看索引的大小 select sum(bytes)/(1024) as "size(kb)",sum(bytes)/(1024*1024) as "size(mb)" from user_segments where segment_name = upper('index_sage'); user_segments表包含了用户的每个对象的存储属性;包括段存储在哪个表空间中,使用了多少字节来存储,使用了多少个块和区已经初始化区大小已经后续分配的区大小等

最新回复(0)