一、同义词(synonym ):
1、同义词概念:
Oracle 数据库中提供了同义词管理的功能。同义词是数据库方案对象的一个别名,经常用于简化对象访问和提高对象访问的安全性。在使用同义词时,Oracle数据库 将它翻译成对应方案对象的名字。与视图类似,同义词并不占用实际存储空间,只有在数据字典中保存了同义词的定义。在Oracle数据库中的大部分数据库对 象,如表、视图、同义词、序列、存储过程、包等等,数据库管理员都可以根据实际情况为他们定义同义词。
2、同义词分类:
Oracle同义词有两种类型,分别是公用Oracle同义词与私有Oracle同义词。
1、公用Oracle同义词:由一个特殊的用户组Public所拥有。顾名思义,数据库中所有的用户都可以使用公用同义词。公用同义词往往用来标示一些比较普通的数据库对象,这些对象往往大家都需要引用。
2、私有Oracle同义词:它是跟公用同义词所对应,他是由创建他的用户所有。当然,这个同义词的创建者,可以通过授权控制其他用户是否有权使用属于自己的私有同义词。
创建公有Oracle同义词的语法:Create [public] synonym 同义词名称 for 你要给那张表取同义词;
删除同义词 Drop synonym 同义词名称
二、视图(view):
1、视图的定义:
视图(view),也称虚表, 不占用物理空间,这个也是相对概念,因为视图本身的定义语句还是要存储在数据字典里的。视图只有逻辑定义。每次使用的时候,只是重新执行SQL。
视图是从一个或多个实际表中获得的,这些表的数据存放在数据库中。那些用于产生视图的表叫做该视图的基表。一个视图也可以从另一个视图中产生。
视图的定义存在数据库中,与此定义相关的数据并没有再存一份于数据库中。通过视图看到的数据存放在基表中。
视图看上去非常象数据库的物理表,对它的操作同任何其它的表一样。当通过视图修改数据时,实际上是在改变基表中的数据;相反地,基表数据的改变也会自动反映在由基表产生的视图中。由于逻辑上的原因,有些Oracle视图可以修改对应的基表,有些则不能(仅仅能查询)。
还有一种视图:物化视图(MATERIALIZED VIEW ),也称实体化视图,快照 (Oracle8i 以前的说法) ,它是含有数据的,占用存储空间。
**tips:** 查询视图没有什么限制, 插入/更新/删除视图的操作会受到一定的限制; 所有针对视图的操作都会影响到视图的基表; 为了防止用户通过视图间接修改基表的数据, 可以将视图创建为只读视图(带上with read only选项)
2、视图的作用:
1)提供各种数据表现形式, 可以使用各种不同的方式将基表的数据展现在用户面前, 以便符合用户的使用习惯(主要手段: 使用别名);
2)隐藏数据的逻辑复杂性并简化查询语句, 多表查询语句一般是比较复杂的, 而且用户需要了解表之间的关系, 否则容易写错; 如果基于这样的查询语句创建一个视图, 用户就可以直接对这个视图进行"简单查询"而获得结果. 这样就隐藏了数据的复杂性并简化了查询语句.这也是oracle提供各种"数据字典视图"的原因之一,all_constraints就是一个含有2个子查询并连接了9个表的视图(在catalog.sql中定义);
3)执行某些必须使用视图的查询. 某些查询必须借助视图的帮助才能完成. 比如, 有些查询需要连接一个分组统计后的表和另一表, 这时就可以先基于分组统计的结果创建一个视图, 然后在查询中连接这个视图和另一个表就可以了;
4)提供某些安全性保证. 视图提供了一种可以控制的方式, 即可以让不同的用户看见不同的列, 而不允许访问那些敏感的列, 这样就可以保证敏感数据不被用户看见;
5)简化用户权限的管理. 可以将视图的权限授予用户, 而不必将基表中某些列的权限授予用户, 这样就简化了用户权限的定义。
3、视图的创建:
**1****权限:** 要在当前方案中创建视图, 用户必须具有create view系统权限; 要在其他方案中创建视图, 用户必须具有create any view系统权限. 视图的功能取决于视图拥有者的权限.
**2** **语法:** create [ or replace ] view [schema.]view_name
[ (column1,column2,...) ]
as
select ...
[ with check option ] [ constraint constraint_name ]
[ with read only ];
三、索引(index ):
1、数据库索引:
在关系数据库中,索引是一种与表有关的数据库结构,它可以使对应于表的SQL语句执行得更快。
索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。
对于数据库来说,索引是一个必选项,但对于现在的各种大型数据库来说,索引可以大大提高数据库的性能,以至于它变成了数据库不可缺少的一部分。
2、索引原理:
\1. 若没有索引,搜索某个记录时(例如查找name='wish')需要搜索所有的记录,因为不能保证只有一个wish,必须全部搜索一遍
\2. 若在name上建立索引,oracle会对全表进行一次搜索,将每条记录的name值哪找升序排列,然后构建索引条目(name和rowid),存储到索引段中,查询name为wish时即可直接查找对应地方
\3.创建了索引并不一定就会使用,oracle自动统计表的信息后,决定是否使用索引,表中数据很少时使用全表扫描速度已经很快,没有必要使用索引
3、索引的使用:
先创建一个测试表
#创建一个测试表
``create table cstable (``id` `int,sex char(1),name char(10));` `#插入5000万行测试数据``begin``for` `i ``in` `1..50000000``loop``insert into cstable values(i,``'M'``,``'ljy'``);``end loop;``commit;``end;``
```
(1)单一索引:
单一索引是指索引列为一列的情况,即新建索引的语句只实施在一列上。
#创建一个单一索引``create index cs_index1 on cstable(``id``);``注:对表的第一列(``id``)创建索引。` `#查看某一行的数据``select` `id``,sex,name from cstable where ``id``=8888888;``创建索引前大约16.77秒,创建索引后查找大约0.366秒
(2)复合索引(基于多个列的索引):
索引分离于表,作为一个单独的个体存在,除了可以根据单个字段创建索引,也可以根据多列创建索引
用户可以在多个列上建立索引,这种索引叫做复合索引(组合索引)。复合索引的创建方法与创建单一索引的方法完全一样。
Oracle要求创建索引最多不可超过32列。
create index cs_index2 on cstable(``id``,sex);``注:对表的列(sex,name)创建索引。` `select` `id``,sex,name from cstable order by ``id``,sex;``#创建索引前大约16.77秒,创建索引后查找大约39.366秒
(3)创建基于函数的索引:
--在cstable表的name列上执行大小写无关的搜索``CREATE INDEX upper_index3 ON cstable(UPPER(name))` `SELECT * FROM cstable WHERE UPPER(name)=``'LJY'
(4)删除和修改索引:
a.重建索引:如果经常在索引列上执行DML操作,需要定期重建索引``ALTER INDEX cs_index1 REBUILD;` `
b.删除索引``DROP INDEX cs_index2;
四、序列(sequence):
1、序列定义:
序列(SEQUENCE)是序列号生成器,可以为表中的行自动生成序列号,产生一组等间隔的数值(类型为数字)。不占用磁盘空间,占用内存。
其主要用途是生成表的主键值,可以在插入语句中引用,也可以通过查询检查当前值,或使序列增至下一个值。
2、创建序列:
创建序列需要CREATE SEQUENCE系统权限。序列的创建语法如下:
CREATE SEQUENCE 序列名
[INCREMENT BY n]
[START WITH n]
[{MAXVALUE/ MINVALUE n| NOMAXVALUE}]
[{CYCLE|NOCYCLE}]
[{CACHE n| NOCACHE}];
3、注意事项:
\1) INCREMENT BY用于定义序列的步长,如果省略,则默认为1,如果出现负值,则代表Oracle序列的值是按照此步长递减的。
\2) START WITH 定义序列的初始值(即产生的第一个值),默认为1。
\3) MAXVALUE 定义序列生成器能产生的最大值。选项NOMAXVALUE是默认选项,代表没有最大值定义,这时对于递增Oracle序列,系统能够产生的最大值是10的27次方;对于递减序列,最大值是-1。
\4) MINVALUE定义序列生成器能产生的最小值。选项NOMAXVALUE是默认选项,代表没有最小值定义,这时对于递减序列,系统能够产生的最小值是?10的26次方;对于递增序列,最小值是1。
\5) CYCLE和NOCYCLE 表示当序列生成器的值达到限制值后是否循环。CYCLE代表循环,NOCYCLE代表不循环。如果循环,则当递增序列达到最大值时,循环到最小值;对于递减序列达到最小值时,循环到最大值。如果不循环,达到限制值后,继续产生新值就会发生错误。
\6) CACHE(缓冲)定义存放序列的内存块的大小,默认为20。NOCACHE表示不对序列进行内存缓冲。对序列进行内存缓冲,可以改善序列的性能。
\7) NEXTVAL 返回序列中下一个有效的值,任何用户都可以引用。
\8) CURRVAL 中存放序列的当前值,NEXTVAL 应在 CURRVAL 之前指定 ,二者应同时有效。
4、小tips:
大量语句发生请求,申请序列时,为了避免序列在运用层实现序列而引起的性能瓶颈。Oracle序列允许将序列提前生成 cache x个先存入内存,在发生大量申请序列语句时,可直接到运行最快的内存中去得到序列。但cache个数也不能设置太大,因为在数据库重启时,会清空内存信息,预存在内存中的序列会丢失,当数据库再次启动后,序列从上次内存中最大的序列号+1 开始存入cache x个。这种情况也能会在数据库关闭时也会导致序号不连续。
五、触发器(trigger):
1、触发器的定义:
\1触发器只作用于(增删改)当你使用触发器后你在执行(增删改)是时候会自动触发触发器
\2触发器不需要手动调用
\3触发器在Oracle里面可以作用于自动增长因为Oracle里面主键不可以自增
2、触发器的使用:
触发器有老表和新表
他们在拿数据时候就要分清楚
类型 | 老表(old) | 新表(new) |
insert(增加) | 没有数据 | 有数据 |
update(修改) | 没有修改的数据 | 修改的数据 |
delete(删除) | 有数据 | 没有数据 |
:odl或者new (一定要加:这个符号)去拿数据
比如:
:odl。name=:new。name
判断新表数据和老表数据是否一样
after在进入表之后触发
before在进入表之前
create or replace trigger 触发器名称
after(before) delete(删除时候自动触发) on stuinfo --定义触发的时间与绑定的表
for each row --行级触发器(不写就是一整个)
begin
你要触发的效果写在这里
end;