其它数据库对象

在前面几节当中我们讲了表和视图,这一节我们讲剩下来的三个数据库对象,包括序列,索引,和同义词,前边

是表和视图,我们讲比较基本的,尤其是表,数据都是存储在表里边的,而这个视图呢,我们也知道了,它实际上是

需要赖以存在的表,叫做基表,它是从这里面抽取出来的,你对这个视图进行修改,他还是会影响到他存在的这个基表的,

这是视图,那这一节我们讲序列,索引和同义词,序列叫做有规律的数值,索引他可以提高查询的效率,同义词他用来给

对象起别名,这里的索引和同义词大家做一个了解,知道他们是什么情况,能够创建一个最好,这一节比较重要的是序列,

序列的概念,那序列的话我们看这儿,我们说表叫Tables,视图叫Views,序列叫Sequences,翻译过来的话就是序列,那么

什么是序列

刚才也说了是用来产生有规律的数值,他写了是唯一数值的数据库对象,用来给多个用户产生唯一数值的,

前面我们讲视图的时候说过,说既然这个东西存在,我们就要想为什么要有他,它主要是用来干什么,序列也是

一样,为什么要有序列,序列主要是用来做什么,这里面已经写了,他主要是用来提供主键值,你这个序列如果装入

内存当中的话,可以用于提高一个访问的效率,这个就是序列的一个作用,它用于提供主键值,而且他还是唯一的

一个数值,怎么来理解,那怎么来使用,我们创建一个序列

创建表叫create table,创建视图叫create view,创建序列就是create sequence,create sequence这个序列的名字,

后边increment by,每次增长的数值,start with从哪个值开始,maxvalue最大值,minvalue最小值,然后是否需要循环,

是否需要缓存,就是这样几条信息,那我们创建一个序列的时候,就从这几条信息出发,我们来写一个序列

和我们当初创建视图一样,你要想创建序列,前提是你得具有这个权限,你要没有这个权限的话,

你在控制台这里加进来,然后呢create sequence,我们起个名字empseq,创建他以后,然后指明increment by,

每次给我增长10个,这个意思就是每次增长10个数,start with我也让他从10开始吧,那么就是从10开始增长,

下面提供一个maxvalue最大值,我写一个100,然后还有最小值,我们没有我们就不写了,就是最小值过了以后,

cycle循环吧,表明需要循环,nocache,不需要缓存登陆,这样呢我们就可以来创建一个序列了

create sequence empseq

increment by 10

start with 10

maxvalue 10

cycle

nocache

创建成功,创建成功以后我们就可以来这里看一下,我们发现这里本身也存在着几个序列,

这是我们刚才创建的这一个

创建好这个序列以后,这个序列是数据库的一个对象,这个对象含有两个方法,这个比较特别,他有两个方法,

他不像我们前边讲的视图,或者数据表一样,select * from一个表,from一个视图,你这里边写他是没有任何

意义的

select * from empseq;

只允许表和视图允许这样来写,不允许换序列,那我们怎么来看这个序列,我select empseq点,这里你理解成

方法或者属性都行,一个是nextvalue,一个是currentvalue,一个叫下一个值,一个叫当前值,假设我们先看一下

当前值,from dual

select empseq.currval from dual;

有一个错误,尚未在此会话当中定义,那如果我们使用另一个呢,nextvalue

select empseq.nextval from dual;

你再写一个

select empseq.nextval from dual;

这个我定义完以后你说我要定义currentvalue

select empseq.currval from dual;

这个时候就可以调用了,从这儿就说明一点,这两个属性也好,方法也好,首次你使用的时候你得使用nextval,

让他出现start with这个值,然后你再使用currentvalue就行了,要不的话相当于你还没有启用,currentvalue

是出不来的,这是我们要说明的一点,然后现在增长到20了,你再往下增

select empseq.nextval from dual;

就往上涨呗

100是我们声明的一个最大值,那再往下涨的话,他就是一个循环,就变成1了

因为100以后第一个数是1,紧接着的是1,再接着让他往下涨

就是这样一直往上涨

这就是我们说的这个序列,这个序列就是现在这样来使用,肯定不是仅仅让你这样来玩的,这有啥意思啊,

他这里写了,主要用来提供主键值

主键值怎么来理解,大家你看实际当中,大家上大学的时候,每个人都分别分配了一个学号,

每个人都有一个学号,而往往你的同学学号都是跟你的挨着的,你是01他就是02,一直这样排下去,那么对于学校来讲,

他有一个数据库,来存放这些学生的信息,第一列叫做一个学号,我这里简单用id来标识,这是id,后边像这个学生名啊,

学生的地址啊,性别啊,等等这样一些信息,那么我们这个数据表怎么来的,肯定是一条一条的往里插入数据的,比如这个

叫张三,然后今年18岁了,来自于河北省,是个男的,然后有个女的,今年16岁,等等这些信息,加进来,前边这个id也是需要

添加的,这是1号,这是2号,然后我们想,你这个id这号,反正每个人的都不一样,然后这些信息是谁的是谁的,然后我根据我的

id,就依次往下排就行,往下依次走就行,我就不想着再每次去写了,或者说我想略过他,单纯的给他提供这一列,它是依次往下,

而且我把它当做一个主键,这个主键是唯一的,非空,唯一且非空,而且我们刚才也说了,序列他就可以用来提供唯一的一个值,

那何不让一个序列来充当一下你,这个主键值,是吧,用序列来充当这个主键值,怎么使用就用我们这里的nextval,每次都给你

写这个东西,他不就一点点的给你往下增长吗,只不过这里每次是增长1,就是我盟刚才说的这个内容,这个序列就仅仅用来提供

主键值,主要用来提供主键值,你看也是正是因为这个原因,你看到我们在这个表里边,已经存在三个序列,他这三个序列干啥用的,

他是不是就是给employees表,departments表,和locations三个表,提供主键的那个值的,因为他们都有那个id,他们这个三个id是

通过序列的,那么我现在有这个序列了,我自己造一个表,用它来给我来提供主键值,我们创建一个表,create table emp01,as select,

employee_id,last_name,salary from employees,where 1=2,我造了一个空表

create table emp01

as

select employee_id,last_name,salary from employees

where 1=2

创建好以后

select * from emp01;

没有数据,我现在下一步

desc emp01;

我往这个表里面去添加一些数据,那就是insert呗,insert into emp01,values,我们之前加的话就是1,然后名字'AA',

2300,就这样呗,给他相应的都赋上值

insert into emp01 values(1,'AA',2300)

把相应的都给赋上值,然后我们现在讲,我们以后再往下加的时候,我把ID当成是这个表的一个主键,我就不这样一个个

去写了,这样写还很麻烦,我怎么写,我就用刚才产生的序列,他来给我提供,提供id这个值,大家你看,现在我们这个叫BB,

2500,提供了一个

insert into emp01

values(empseq.nextval,'BB',2500)

这个是不是就不用改了,你每次调用一下他就给你自动的往下加一下

insert into emp01

values(empseq.nextval,'CC',3600)

insert into emp01

values(empseq.nextval,'DD',5500)

我加了几条

select * from emp01;

他自动的会给你往上递增,这个多方便啊,这个就不用每次亲自去写了,省去一个人工的劳动力了,

再者呢,它会自动的给你去给你往上长,一定会给你一个唯一值的,我们一会可以改,就是这样子的,

那下一个我们就说说改这个事吧,ID我们每次让他改一个就行,每次涨10个,感觉不太理想,那我每次让他

涨一个,对序列的一个修改,修改的话,同理,要是对table和view属性的话,这是不是也是alter,alter sequence,

他呗,我想改一下increment,by,每次增长1,然后我也不让你循环了,nocycle就是不让你循环了,每次往上涨1就行,

alter sequence empseq

increment by 1

nocache

改了,改了以后,你看这个时候我再往里面去insert,EE,6500

insert into emp01

values(empseq.nextval,'EE',6500)

大家看,这个时候就增长了一个E,而且它是没有上限的,就是一直往上,非常的方便,这也是我们讲序列的主要的

一个使用,修改我们后边这里有,修改一个序列,提供的是alter sequence

修改序列可以修改它的增量,最大值,最小值,循环的选项,以及是否装入内存,能够更改这样一些信息,

初始值这个需要大家额外注意,这个初始值的更改,比较麻烦,你看这个序列改之前已经是61了,你不能

改成开头1,改成开头1添加就重复1了,我这个更改比较麻烦,他说如果你要改变这个初始值的话,那你得

删除这个序列,或者是重建这个序列,这个是你需要注意的,当然你这整个修改的过程,前提是你需要有这种

权限才行,你有这个修改的权限你才能够改,一般我们具有创建序列的权限的话,我们才改,这是我们讲的这个意思

然后呢我们这里还有一种情况,当然你看这个,我们正常这样使用序列就行了,这就是主要的一个使用,

然后这里说会出现一个裂缝,会出现一个裂缝,裂缝这个概念以前没有说过,没有接触过,什么叫裂缝,

就来源于生活当中,比如说这个路面,用的时间久了以后会有一道缝,或者夫妻之间,男女之间吵了一次

架,因为中间有一个第三者,两者之间的关系产生了一个裂缝,意思就是没有像原来那么,比如说在我们这里边,

前边我们就先不管了,每次增长1连着的,突然62中间没有,出现63,再接着出现64,没有62,这是不是就是一个裂缝,

什么情况会导致这个裂缝,一是回滚,第二系统异常,第三多个表同时使用同一个序列,这三种情况会导致裂缝,那我们

就稍微说一说,先说这个吧,多个表使用同一个序列,这个我就不额外给大家举例子了,我就这样说一说就行

现在有一个表emp01,假如我现在再创建一个表emp02,然后这个表和这个表的框架一样,假设你也有这样三列拿过来,

一个叫ID,一个叫NAME,一个叫SALARY,如果我们这个表也是用empseq,来提供主键值的话,下一个一insert他就成了

63了,因为你这是到62了,这63加进来,你再加进来就是64,再往里加,你再加了两条以后,我这个表也使用这个序列,

再往这里加可不就是63了,是65了,就65了,那这样来看,这是不是就是一个裂缝,这个数没有连起来,所以我们再使用序列的时候,

大家尽量不要多个表公用同一个序列,你看我们这个表,人家是一个表一个序列,避免出现这个裂缝,这是这样一种情况,这里面还

提到一种叫回滚

叫回滚,回滚这是一种什么情况,我举个例子吧,这种情况我们说一下,你这叫emp01,我这个时候commit;

这个大家理解吧,这个我们已经提交了,提交以后呢,我insert一条数据,FF,7500

insert into emp01

values(empseq.nextval,'FF',7500)

insert以后我再select一下

select * from emp01;

这没问题,他三是连着的,这个时候我操作完以后,我rollback了

rollback;

回滚,回滚完了我再insert一个,那就GG,8500

insert into emp01

values(empseq.nextval,'GG',8500)

这个时候如果我select一下,你看看是什么效果

select * from emp01;

是不是中间产生一个断裂,这明显就断裂了,这是什么情况,你看我们一开始就是61,62,我在这个时候,我给commit了,

然后我就insert了一下,insert就是63,然后我就rollback,你一rollback,就挂了啊,就没有他了,这个就会挂了,

挂了之后你再insert了,因为你这个序列人家可不给你rollback,他会自动的给你提交了,所以你再insert就变成64了,

相当于63就没有了,这也叫一个断裂,大家你这种情况你知道就行了,理解一下就行,你不需要过多关注,然后你使用的时候,

你一个表维护一个序列,如果不将序列的值装入内存,使用这个查看当前序列的有效值,你或者在这看,或者我们这里有一个

叫查看序列

我们可以通过这样一个命令,查看我们的序列都有哪些

这不就是这四个吗,这个是我们自己创建的,这个如果当你没有考虑SQL的问题的时候,显示的是下一个值,

64,下一个值就是65,这个你知道就完了,这个就是我们说的序列的这个情况,后边我们修改说了,再下来就是删除了,

删除序列和之前的数据库对象一样

drop sequence empseq;

那不就是删了,然后你再来看,已经没有了,这就是我们讲的序列的知识,说到这儿了,我们这节内容的一个重点,

下面叫索引,我们看看这个索引,索引这个词大家肯定听过,我们小学的时候肯定接触过字典吧,字典在前面是不是

都有索引,都有这个索引,这个索引和刚才说的字典的索引,实际上是一回事,那我们字典里的索引的作用不就是我们大家

你在查的时候我通过这个索引提高查询的一个效率,你如果没有前边这个索引,你要找一个字其实挺麻烦的,一点点的去翻

是吧,那有了索引以后,这个字有几划,然后在这找到以后,我直接翻到那一页就行,是不是查询速度非常快,那就是索引的一个

好处,那到以后也是一样,他既然叫索引,跟索引实际上是类似的,我们看一下这个说明,索引是独立于表的模式对象,可以存储在

与表不同的磁盘或表空间中,这个了解一下就行,索引被删除或损坏,不会对表产生影响,其影响只是查询的一个速度,大家你看

这个字典,如果我把前面的索引都撕掉了,你查字一点都不会受影响,这个字典假如有2万个字,你把索引撕掉之后还是2万多个字,

你把索引撕了之后字还是那么多,他不影响你这个表,我在查字典的时候费点劲,我就得一页页的翻一翻,看看那个字在哪,索引在这也

一样,如果他被损坏的话,他不影响你这个表,只是我查询的速度就慢了,下边说,索引一旦创建,我们可以造一个索引,你索引一旦建立了,

ORACLE系统会自动的对他进行维护,而且由ORACLE系统决定何时来引用,用户在查询语句中不用指定哪个索引,就是你自己创建一个索引,

等你创建好以后,你不用显示的去调用,程序调用指定表的时候,它会自动的去获取你这个索引,就会能够加速,删除一个表的时候,所有基于

这个表的索引会自动删除,很容易理解,通过指针加速ORACLE服务器的查询速度,然后减少磁盘的IO,就是索引的作用,说白了就是加速,

那下一个就是来创建一个索引,如何来创建索引,刚才我们说的就是索引到底是干什么用的,既然知道是干这个用的

创建你看这儿,写了两个,一个叫自动创建,一个叫手动创建,这个有点特别了,其他的数据库对象是没有的,

自动创建你看,在定义primary key,或者unique约束以后,系统会自动的在相应的列上创建唯一性索引,这个索引

也是唯一的,那他既然是可以自动创建呢,大家你看一下,我们这里边是不是有一些表,就比如说employees表,他这个表

有主键,有唯一性约束,他说这两个会自动来创建索引,你看这儿,索引,翻译成英语,叫index,双击,大家你看到,是不是

这个就是主键,这个是unique主键,他会自动的创建这两个索引,你自己创建一个表,加上主键,加上唯一性约束的话,

他也会自动的给你创建index

这个我们就不多说,这个叫自动来创建,除了自动创建以外,还可以手动的来创建,用户可以在其它列上创建非唯一的

索引,加速查询

那创建方式就这样,create索引,索引名,on哪个表的哪些列,它是通过列来加速你这个查询,是吧,就像我们刚才

看employees表一样,它是对应在ID和email这两个列上的,当你通过id或email对这个表中的数据进行查询的时候,

他能够自动的给你后台加速,那你说你删了这两个索引有没有问题,一点问题也没有,只是说你查询的时候速度变慢了,

那我们手动来创建这个索引,我给谁创建啊,我们那会创建一个表叫,emp01,你看他这里边的索引,我给他创建一个索引,

create index,索引emp01,我是作用id上的,create他on,emp01,这个表的employee_id这个列

create index emp01_id_ix on emp01(employee_id)

作用好了,作用好了以后我们再来看一下,你看这儿是不是就有这个了

然后我们这个表的数据量还不小,当你下次进行ID查询表的数据的时候,比如where id小于一千,它会自动

来提高你的查询数据,就是这样的,那你这是创建了一个索引,然后删除的话同样叫job,drop index emp01,

drop index emp01_id_ix;

这就是删除这个索引,知道如何来创建以后,我们下一个需要问的,当然我们也知道如何来删除了,

下一个你看这个知识点,叫什么时候创建,你看,我们刚才一开始讲了,索引是干什么的,知道有好处,

能够加速,然后我们说怎么来创建,创建也讲了,下一个说你什么时候来用它,什么时候来创建索引,

大家你看这个,当你列中数据值分布很广的时候,那我就可以把这个列用索引来处理一下,当你再用这个列

来查询的时候就会更快,这里说明什么啊,不是索引提高速度你就乱创建索引,那有的时候你创建多了还麻烦呢,

还变慢了,什么时候才是真正变快了,就是列中的数值首先分布范围很广,比如说这里有一个表,这个表就是公司的

员工数,这公司的员工,你有一个叫年龄这一列,中国人说正常人的年龄,从0,撑死到130,你看这几个总共也没几个,

而且还都是整数,这个我们认为分布范围比较小,那你给这个年龄上加上一个索引,你就觉得没有必要,那你比如说现在

又有一个表,他记录的是人的工资,员工的工资,那你工资的话,就像正常一个人,工资有可能是0,有的人可能是上亿,

那你这个范围分布是极广的,给这样一个列加上一个索引,那你再通过这个列来查询一些数据信息的时候,他就会降低

复杂度,这个就不一定,这是一个情况,第二个呢,这个列经常作为where字句或者连接出现,经常把他作为一个条件查询,

使用比较频繁,那我就给你加索引,再一个,表经常被访问而且数据量很大,访问的数据量大概占数据总量的2%和3%,就是

被访问的数据量很大,但是要被访问的数据大概是这么多,比如你这个字典,你要查的要占到你要查的一半以上,你每次查

这个字还通过你的索引,反而变慢了,因为你调索引,还得需要一个时间呢,你后边频繁的被调用

什么时候不要创建索引,比如你这个数据量刚才查询的,刚才也说了,查询太多了,不经常在where中出现,

或者表很小,这都不用加索引,或者你这个表经常被更新,也不需要,因为我们说你创建这个索引,然后在查询的时候,

速度变快了,那相应的你在进行增删改的时候,你就变慢了,一定是有这样一个逻辑的,有些东西你有好处,也有不好的,

你看现在这个安卓手机,或者苹果手机,非常方便,就像电脑一样,但是我能够明显感觉到,人跟人的交流少了,任何事务的

出现他有利也有弊,那我们这个索引也是一样,你这个索引既然能够加速,那你查询的时候加速了,那你进行更改的时候,

就慢了,因为他在改的同时需要维护一个索引,这就是我们说的这个内容

同义词这个翻译就是他,他呢使用同义词访问相同的对象,方便访问其他用户的对象,缩短对象名字的长度,

这个作用就是他,你看我们之前的employees老长了,仅自己的select用,出了select就没用了,那我可以造一个

同义词,就这样我造一个同义词

create synonym e for employees;

权限不足,我还得有这个权限才能造,增加这个权限,我还是以DBA的权限进入

我自己是服务器,scott用户增加一个系统权限,在这儿

然后添加进来,然后确定

关了以后我再来

CREATE SYNONYM e FRO employees;

创建了,创建好以后,这个时候如果你再select的话

select * from e;

这还是employees这个表

在这就相当于多了一个同义词,同义词就在这,就是这个E

它是一个物理文件了,你下次再来用employees表的时候,还可以用这个E来表示,这个就是我们讲的同义词,

了解一下就可以了,创建同义词,你再删的话还是drop,还是drop

序列,索引和同义词,大家重点在序列,同义词是给数据库对象重新取个名字,在查询的时候就比较短,这个好理解,

这个时候你虽然给他取了一个同义词,但是你还是想查询原来的employees,一点也不影响

select * from employees;

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值