Oracle 数据库对象又称模式对象,数据库对象是逻辑结构的集合,最基本的数据库对象是表。数据库
其余数据库对象包括:安全
同义词是现有对象的一个别名。它的做用有:函数
1.简化SQL语句性能
2.隐藏对象的名称和全部者(隐藏原始对象内容)spa
3.提供对对象的公共访问code
同义词共有两种类型:对象
公有同义词可被全部的数据库用户访问。索引
私有同义词只能在其模式内访问,且不能与当前模式的对象同名。内存
建立或替换现有同义词ci
create or replace synonym emp_syn for scott.emp;
删除同义词
drop synonym emp; drop public synonym emp_syn
使用同义词
Create public synonym Newer for scott.emp2; Select * from Newer ;
序列是用于生成惟1、连续序号的对象,序列能够是升序的,也能够是降序的,能够用于表示数据的数量。咱们可使用CREATE SEQUENCE语句建立序列。
Create sequence 序列名 Start with 1 --指序列开始大小,默认为1 Increment by 1 --每次的增量,默认为1 Maxvalue 2000 --序列的最大数 Minvalue 1 --序列的最小数 Nocycle --当序列最大了将再也不生成整数(默认) Cache 10; --保留在内存中整数的个数,默认20
注意:序列在使用的时候,若是给的是主键,为防止出现不连续的状况,应该设置为NOCACHE。
从user_sequences中查出全部的序列信息。
select * from user_sequences;
经过序列的伪列来访问序列的值
1.NEXTVAL 返回序列的下一个值
2.CURRVAL 返回序列的当前值
注意:序列在使用的时候,若是给的是主键,为防止出现不连续的状况,应该设置为NOCACHE。
INSERT INTO toys (toyid, toyname, toyprice) VALUES ( toys_seq.NEXTVAL, ‘TWENTY’, 25); INSERT INTO toys (toyid, toyname, toyprice) VALUES ( toys_seq.NEXTVAL, ’MAGIC PENCIL’, 75); --toys_seq.NEXTVAL 指定序列的下一个值
SELECT toys_seq.CURRVAL FROM dual; --检索序列的当前值
使用ALTER SEQUENCE语句修改序列,不能更改序列的START WITH参数
ALTER SEQUENCE toys_seq MAXVALUE 5000 CYCLE;
使用DROP SEQUENCE语句删除序列
DROP SEQUENCE toys_seq;
视图以通过定制的方式显示来自一个或多个表的数据,视图能够视为“虚拟表”或“存储的查询”,建立视图所依据的表称为“基表”。
视图的优势有:
1.提供了另一种级别的表安全性
2.隐藏的数据的复杂性
3.简化的用户的SQL命令
4.隔离基表结构的改变
5.经过重命名列,从另外一个角度提供数据
例:
CREATE VIEW stud_view AS SELECT studno, studname, subno FROM Stud_details;
经过这个视图,查询到的结果:
建立视图的语法:
CREATE [OR REPLACE] [FORCE] VIEW view_name [(alias[, alias]...)] AS select_statement [WITH CHECK OPTION][CONSTRAINT C_NAME] [WITH READ ONLY]; --禁止对表进行更新删除操做 --W ITH CHECK OPTION CONSTRAINT _NAME :表示增长一个检查约束,INSERT和UPDATE时候必需要求: --INSERT时候要求插入的数据必须符合定义时候设置的where条件一致,UPDATE 时候只能改除where条件列之外的其余数据列或者修改的条件列的值符合where条件 --
使用 WITH CHECK OPTION 选项建立视图
create or replace view pause_view as select * from order_master WHERE ostatus = 'p' with check option constaint chk_pv;
使用 ORDER BY 子句建立视图
create or replace view ord_ven as select * from vendor_master order by venname;
联接视图:两个表的结果
create view Stud_sub_view as select Studno, Studname, Submrks, Subname from Stud_details, Sub_Details where Stud_details.Subno=Sub_details.Subno;
建立外联接视图
CREATE VIEW ven_ord_outj_view AS SELECT vm.vencode, venname, orderno, odate, ostatus FROM vendor_master vm, order_master om WHERE vm.vencode = om.vencode(+);
等同于
SELECT vm.vencode, venname, orderno, odate, ostatus FROM vendor_master vm LEFT OUTER JOIN order_master om ON vm.vencode = om.vencode;
在视图上也可使用修改数据的DML语句,如INSERT、UPDATE和DELETE
视图上的DML语句有以下限制:
1.只能修改一个底层的基表
2.若是修改违反了基表的约束条件,则没法更新视图
3.若是视图包含链接操做符、DISTINCT 关键字、集合操做符、聚合函数或 GROUP BY 子句,则将没法更新视图
4.若是视图包含伪列或表达式,则将没法更新视图
若是往视图中添加数据,数据能够添加到基表,但若是插入的数据不符合视图的where等条件的要求,则视图中不会显示。若是但愿插入的数据要符合视图定义的时候,where要确则须要添加参数。
若是要从视图中删除基表的数据,被删除的这条数据必须符合视图的查询条件,才能经过视图删除该数据。
键保留表是理解链接视图修改限制的一个基本概念。该表的主键列所有显示在视图中,而且它们的值在视图中都是惟一且非空的。也就是说,表的键值在一个链接视图中也是键值,那么就称这个表为键保留表。
由于 Studno 既是Stud_details 中的主键,也是联接结果中的主键,所以Stud_details是键保留表
视图中可使用单行函数、分组函数和表达式
CREATE VIEW item_view AS SELECT itemcode, LOWER(itemdesc) item_desc FROM itemfile;
使用DROP VIEW语句删除视图
DROP VIEW toys_view;
索引是与表相关的一个可选结构,使用索引能够提升 SQL 语句执行的性能,减小磁盘I/O,索引在逻辑上和物理上都独立于表的数据,Oracle 可以自动维护索引。
索引的原理:索引的工做原理是与一个叫作ROWID的概念紧密相关的,Oracle在建立数据表时,默认会为每一个数据表创建一个隐含字段,叫ROWID。在向数据表中插入记录时,系统将自动为每条记录分配唯一的一个ROWID号,利用这个ROWID号,就能够快速定位到记录。
使用 CREATE INDEX 语句建立索引:
建立标准索引:Create index 索引名 on 表名(列名);
CREATE INDEX item_index ON itemfile (itemcode) TABLESPACE index_tbs;
重建索引
ALTER INDEX item_index REBUILD;
删除索引
DROP INDEX item_index;
索引有各类类型,除了标准索引外,还有一些特殊类型的索引:
惟一索引确保在定义索引的列中没有重复值,Oracle 自动在表的主键列上建立惟一索引
使用CREATE UNIQUE INDEX语句建立惟一索引
CREATE UNIQUE INDEX item_index ON itemfile (itemcode);
组合索引是在表的多个列上建立的索引,索引中列的顺序是任意的,若是 SQL 语句的 WHERE 子句中引用了组合索引的全部列或大多数列,则能够提升检索速度。
CREATE INDEX comp_index ON itemfile(p_category, itemrate);
反向键索引反转索引列键值的每一个字节,一般创建在值是连续增加的列上,可使数据均匀地分布在整个索引上
建立索引时使用REVERSE关键字
CREATE INDEX rev_index ON itemfile (itemcode) REVERSE;
ALTER INDEX rev_index REBUID NOREVERSE;
位图索引适合建立在低基数列上,位图索引不直接存储ROWID,而是存储字节位到ROWID的映射,使用位图索引能够减小响应时间,节省空间占用。
CREATE BITMAP INDEX bit_index ON order_master (orderno);
索引组织表的数据存储在与其关联的索引中,索引中存储的是行的实际数据,而不是ROWID,它基于主键访问数据。
CREATE TABLE 命令与 ORGANIZATION INDEX 子句一块儿用于建立索引组织表。
CREATE TABLE ind_org_tab ( vencode NUMBER(4) PRIMARY KEY, venname VARCHAR2(20) ) ORGANIZATION INDEX;
普通表与索引组织表的比较
普通表 |
索引组织表 |
ROWID 惟一地标识行 |
主键惟一地标识行 |
隐式的 ROWID 列 |
没有隐式的 ROWID 列 |
基于 ROWID 的访问 |
基于主键的访问 |
顺序扫描返回全部行 |
彻底索引扫描返回全部行,并按主键顺序排列 |
支持分区 |
不支持分区 |
基于一个或多个列上的函数或表达式建立的索引,表达式中不能出现聚合函数,不能在LOB类型的列上建立,建立时必须具备 QUERY REWRITE 权限,当查询使用了函数的时候,索引将再也不使用,因此要创建函数索引。
CREATE INDEX lowercase_idx ON toys (LOWER(toyname));
SELECT toyid FROM toys WHERE LOWER(toyname)='doll';
咱们能够将索引存储在不一样的分区中。
与分区有关的索引有三种类型:
1.局部分区索引 - 在分区表上建立的索引,在每一个表分区上建立独立的索引,索引的分区范围与表一致
2.全局分区索引 - 在分区表或非分区表上建立的索引,索引单独指定分区的范围,与表的分区范围或是否分区无关
3.全局非分区索引 - 在分区表上建立的全局普通索引,索引没有被分区
与索引有关的数据字典视图有:
1.USER_INDEXES - 用户建立的索引的信息
2.USER_IND_PARTITIONS - 用户建立的分区索引的信息
3.USER_IND_COLUMNS - 与索引相关的表列的信息
SELECT INDEX_NAME, TABLE_NAME, COLUMN_NAME FROM USER_IND_COLUMNS ORDER BY INDEX_NAME, COLUMN_POSITION;