數(shù)據(jù)庫對(duì)象
常見:表:存放數(shù)據(jù)的基本數(shù)據(jù)庫對(duì)象,由行(記錄)和列(字段)組成
約束條件:執(zhí)行數(shù)據(jù)校驗(yàn),保證數(shù)據(jù)完整性的系列規(guī)則
視圖:表中數(shù)據(jù)的邏輯顯示
索引:根據(jù)表中指定的字段建立起來的順序,用于提高查詢性能
序列:一組有規(guī)律的整數(shù)值
同義詞:對(duì)象的別名
命名:必須以字母開頭??梢园帜?、數(shù)據(jù)、下劃線、$、#
同一方案(用戶)下的對(duì)象不能重名。不能使用Oracle的保留字
補(bǔ)充:Oracle數(shù)據(jù)庫中的表分為用戶定義的表和數(shù)據(jù)字典表
用戶定義的表:用戶自己創(chuàng)建并維護(hù)的一組表,包含了用戶所需的信息
數(shù)據(jù)字典表:由Oracle數(shù)據(jù)庫自動(dòng)創(chuàng)建并維護(hù)的一組表,包含數(shù)據(jù)庫信息
創(chuàng)建表
概述:創(chuàng)建表需要兩個(gè)前提條件,即具備創(chuàng)建表的權(quán)限和有可用的存儲(chǔ)空間
創(chuàng)建表時(shí)必須指定表名、字段名、字段類型。create table為DDL語句,一經(jīng)執(zhí)行不可撤銷
語法:create table [schema.]table(column datatype [default expr][,...]);--缺省是將表創(chuàng)建在當(dāng)前方案(用戶)下
舉例:create table scott.test1(name varchar2(20),hiredata date default sysdate,salary number(8,2) default 0);
向test1插入新記錄的時(shí)候,若沒有指定hiredate值,缺省就會(huì)取當(dāng)前的系統(tǒng)時(shí)間。同樣也設(shè)置了salsry的缺省值為0
如果插入記錄的時(shí)候也沒有指定eid的值,那么eid的缺省值是null。注意數(shù)值型的缺省值不是0,而是null
補(bǔ)充:還可以使用子查詢創(chuàng)建表。這是創(chuàng)建表的另一種方式,但不是很常用。即創(chuàng)建表的同時(shí)將子查詢的結(jié)果直接插入其中
新建表與子查詢結(jié)果的字段列表必須匹配。新建表的字段列表可以缺省,這時(shí)字段名就跟子查詢的結(jié)果的字段名相同
語法:create table [schema.]table(column[,...]) as subquery;--括號(hào)中不可以定義字段類型
舉例:create table myemp2 as select empno,ename,sal*12 from emp;--非法。表達(dá)式不可以充當(dāng)字段,需要指定別名
create table myemp2 as select empno,ename,sal*12 annsal from emp;--合法
create table myemp(編號(hào),姓名,年薪) as select empno,ename,sal*12 from emp;--指定新建表的字段名
修改表結(jié)構(gòu)
概述:使用alter table語句修改表的結(jié)構(gòu)。包括添加、修改、刪除字段。alter語句為DDL語句,一經(jīng)執(zhí)行不可撤銷
添加:在alter table語句中使用add子句添加新字段。新字段只能被加到整個(gè)表的最后
alter table table add(column datatype [default expr] [column datatype]...);
alter table test1 add(grade number(3),phone varchar2(20) default '無');
修改:在alter table語句中使用modify子句修改現(xiàn)有字段。包括數(shù)據(jù)類型、大小和默認(rèn)值。但不可以修改字段名
alter table table modify(column datatype [default expr] [column datatype]...);
alter table test1 modify(grade number(2),phone varchar2(15) default '010-12345678');
修改的缺省值設(shè)置,只對(duì)此后新插入的記錄有效。修改操作會(huì)受到當(dāng)前表中已有數(shù)據(jù)的影響
當(dāng)已有記錄的相應(yīng)字段只包含空值時(shí),類型和大小都可以修改。如果該字段已包含數(shù)值,則修改可能失敗
刪除:在alter table語句中使用drop子句刪除字段。從每行中刪除該字段占據(jù)的長度和數(shù)據(jù),釋放在數(shù)據(jù)塊中占用的存儲(chǔ)空間
alter table table drop(column[,column]...);
alter table test1 drop(grade,phone);
清空表數(shù)據(jù)
概述:使用truncate table可以清空表中數(shù)據(jù)。清除表中所有記錄,釋放表的存儲(chǔ)空間,它是DDL語句,一經(jīng)執(zhí)行不可撤銷
它與DML中的delete語句有很大的差別。delete可以進(jìn)行條件性的刪除,也可以定義到事務(wù)中,對(duì)其進(jìn)行回滾或撤銷
語法:truncate table table;--它清除的并不是表格本身,表的結(jié)構(gòu)還是存在的,只不過變成了一個(gè)空表
刪除表
概述:使用drop table語句刪除表,它是DDL語句,一經(jīng)執(zhí)行不可撤銷
表中所有數(shù)據(jù)將被刪除,此前未完成的事務(wù)將被提交,所有相關(guān)的索引被刪除
語法:drop table table;
重命名表
概述:使用rename語句可以改變現(xiàn)有表的名稱,它是DDL語句,一經(jīng)執(zhí)行不可撤銷
也可修改其它數(shù)據(jù)庫對(duì)象(視圖、序列、同義詞等)的名稱。執(zhí)行重命名操作的必須是對(duì)象的所有者
語法:rename old_name to new_name;
舉例:rename test1 to test88;
數(shù)據(jù)字典
概述:數(shù)據(jù)字典是Oracle數(shù)據(jù)庫的核心,用于描述數(shù)據(jù)庫及其所有對(duì)象。數(shù)據(jù)字典由一系列只讀的表和視圖組成
這些表和視圖屬SYS用戶擁有,由Oracle Server負(fù)責(zé)維護(hù),用戶可以通過select語句進(jìn)行訪問
內(nèi)容:數(shù)據(jù)庫的物理和邏輯結(jié)構(gòu)。對(duì)象的定義和空間分配。完整性約束條件。用戶。角色。權(quán)限。審計(jì)記錄
視圖:數(shù)據(jù)字典中的視圖都是只讀的,主要可以分為如下三類
dba(所有方案包含的對(duì)象信息)、all(用戶可以訪問的對(duì)象信息)、user(用戶方案的對(duì)象信息)
舉例:select table_name from user_tables;--查看當(dāng)前用戶擁有的所有表的名字
select table_name from all_tables;--查看當(dāng)前用戶可以訪問的所有表的名字
select distinct object_type from user_objects;--查看當(dāng)前用戶擁有的所有對(duì)象的類型
select distinct object_type from all_objects;--返回當(dāng)前用戶可以查看的所有的對(duì)象的類型
select table_name frome dba_tables;--查看所有用戶擁有的所有表的名字
select * from user_constraints;--查看當(dāng)前方案(用戶)下所有的約束的信息
select * from user_constraints where table_name='student';--查看當(dāng)前方案(用戶)下的student表中的約束信息
約束(Constraint)
概述:約束是在表上強(qiáng)制執(zhí)行的數(shù)據(jù)校驗(yàn)規(guī)則,用于保護(hù)數(shù)據(jù)的完整性
具體包括五種,即not null(非空)、unique key(唯一鍵)、primary key(主鍵)、foreign key(外鍵)、check(檢查)
分類:域完整性約束:not null、check。實(shí)體完整性約束:unique、primary key。參照完整性約束:foreign key
說明:約束也是一種數(shù)據(jù)庫對(duì)象。如果創(chuàng)建約束時(shí),用戶沒有指定它的名字,那么系統(tǒng)會(huì)自動(dòng)的為其命名
在Oracle使用SYS_Cn格式命名約束,也可以由用戶命名。也可以通過數(shù)據(jù)字典視圖查看約束
可以在建表的同時(shí)添加約束,也可以在建表后單獨(dú)添加約束。可以在表級(jí)或列級(jí)定義約束
通常并不太建議在建表之后再添加約束或者建表之后再修改表的結(jié)構(gòu)
查看:查詢用戶字典視圖user_constraints可得到當(dāng)前用戶的所有約束。即select * from user_constraints;
查詢用戶字典視圖user_cons_columns可獲知約束建立在哪些字段上。即select * from user_cons_columns;
創(chuàng)建:create table [schema.]table(column datatype[default expr][column_constraint],...[table_constraint]);
alter table table add [constraint constraint_name] constraint_type(column);--這是建表后添加約束
比如alter table stu add constraint stu_sid_pk primary key(sid);--原stu表中有sid和name兩個(gè)字段
等價(jià)alter table stu add primary key(sid);--只不過此時(shí)的約束名就會(huì)由系統(tǒng)自動(dòng)設(shè)定了
特例:建表后添加約束時(shí),非空約束必須使用modify子句添加。實(shí)際上相當(dāng)于重新定義了某個(gè)字段
如alter table stu modify(name not null);或alter table stu modify(name char(8) default 'N/A' not null);
也可以修改多個(gè)字段,如alter table stu modify(sid not null,name default 'Stone' not null);
刪除:語法為alter table table drop constraint constraint_name;
alter table table drop primary key;--刪除主鍵的另一種方式。只有主鍵才可以這樣刪除
因?yàn)橐粋€(gè)表中只可以定義一個(gè)主鍵,所以不會(huì)有二義性。而其它的約束,都可能定義多個(gè)
續(xù)一:刪除約束時(shí),若存在與該約束相關(guān)聯(lián)的其它約束,則刪除操作會(huì)失敗??捎胏ascade子句將其它關(guān)聯(lián)約束一并刪除
語法為alter table table drop constraint constraint_name cascade;
這個(gè)時(shí)候一共刪除了兩個(gè)約束,一個(gè)是主表中的主鍵,一個(gè)是子表中的外鍵
續(xù)二:刪除表中字段時(shí),若該字段處于多字段聯(lián)合約束條件(聯(lián)合主鍵、聯(lián)合唯一鍵、存在參照當(dāng)前字段的外鍵)中時(shí)
則刪除會(huì)失敗。此時(shí)可使用cascade constraints子句將與該字段相關(guān)的約束一并刪除
語法為alter table table drop(column[,column]...) cascade constraints;
禁用:在alter table中,可使用disable constraint子句禁用已有約束。也可用cascade選項(xiàng)將相關(guān)聯(lián)的約束也一并刪除
語法為alter table table disable constraint constraint_name [cascade];
禁用跟刪除不同,它還可以啟用。而且約束的具體內(nèi)容或約束的定義等,還是存在的,只是臨時(shí)不起作用了
啟用:在alter table中,可使用enable constraint子句啟用已被禁用的約束
語法為alter table table enable constraint constraint_name;
啟用約束后,就無法再使用cascade選項(xiàng)一并啟用相關(guān)聯(lián)的其它約束。若仍想使用其它約束,則只能重建其它約束
非空約束(not null)
特點(diǎn):只能在字段級(jí)定義。確保字段值不能為空。一個(gè)表中可以定義多個(gè)非空約束
舉例:create table strudent(sid number(3) not null,name varchar2(20),birth date constraint nn not null);
說明:constraint nn not null也是非空約束,只不過birth的約束名字是由用戶命名的,而sid的約束是由系統(tǒng)命名的
constraint是一個(gè)保留字,說明這里要添加一個(gè)約束,nn是約束的名字,后面的not null是約束的類型
按照慣例,約束名習(xí)慣命名為“表名_字段名_約束的類型簡(jiǎn)稱”這里就應(yīng)該是student_birth_nn
唯一性約束(unique)
特點(diǎn):既可以在字段級(jí)定義,也可以在表級(jí)定義。用于確保所在的字段(或字段組合)不出現(xiàn)重復(fù)值
唯一性約束的字段允許出現(xiàn)空值。Oracle會(huì)自動(dòng)為唯一性約束創(chuàng)建對(duì)應(yīng)的唯一性索引。一個(gè)表中可以定義多個(gè)唯一鍵
舉例:create table student(sid number(3) unique,name varchar2(20));--字段級(jí)定義
create table student(sid number(3),name varchar2(20),constraint strudent_sid_un unique(sid));--表級(jí)約束
說明:對(duì)一個(gè)字段進(jìn)行唯一性約束時(shí),這兩種效果相同的。若需要對(duì)多個(gè)字段定義唯一性約束的話,則只能定義成表級(jí)約束
如create table fenshu(a number(3),b varchar2(20),c number(4),constraint fenshu_a_b_un unique(a,b));
也就是說a和b兩個(gè)字段的值組合起來不能出現(xiàn)重復(fù)??梢园阉胂蟪墒且粡垖W(xué)生分?jǐn)?shù)表,a和b相當(dāng)于學(xué)號(hào)和科目
主鍵約束(primary key)
特點(diǎn):主鍵既可以在字段級(jí)定義,也可以在表級(jí)定義。主鍵用于唯一標(biāo)識(shí)表中的某一行記錄,功能上相當(dāng)于非空且唯一
一個(gè)表中只允許一個(gè)主鍵,主鍵可以是單個(gè)字段或多字段的組合。Oracle會(huì)自動(dòng)為主鍵字段創(chuàng)建對(duì)應(yīng)的唯一性索引
舉例:create table student(sid number(3) primary key, name varchar2(20));
create table student(sid number(3),name varchr2(20), constraint student_sid_pk primary key(sid));
聯(lián)合:由多個(gè)字段組合而成的主鍵也稱聯(lián)合主鍵。聯(lián)合主鍵中每一個(gè)字段都不能為空
聯(lián)合主鍵字段組合的值不能出現(xiàn)重復(fù)。聯(lián)合主鍵只能定義為表級(jí)約束
create table fenshu(a number(3),b varchar2(20),c number(3),constraint fenshu_a_b_pk primary_key(a,b));
同樣是學(xué)生分?jǐn)?shù)表。其實(shí)學(xué)號(hào)和科目組合起來更應(yīng)該設(shè)成主鍵,而不是唯一鍵,因?yàn)樗鼈兊闹狄膊粦?yīng)該為空
外鍵約束(foreign key)
特點(diǎn):外鍵用于確保相關(guān)的兩個(gè)字段之間的參照關(guān)系,以實(shí)現(xiàn)參照完整性約束。外鍵參照的必須是主表的主鍵或者唯一鍵
外鍵約束通常構(gòu)建于來自不同表的兩個(gè)字段之間。子表外鍵列的值必須在主表參照列值的范圍內(nèi),或者為空
主表的主鍵或唯一鍵被子表參照時(shí),主表相應(yīng)記錄不允許被刪除。
參照:所謂的參照完整性約束,比如說員工信息表和工資表,二者是通過員工編號(hào)建立連接的
這時(shí)工資表中的員工編號(hào)是受限制的,即必須是出現(xiàn)在員工信息表中的,這種關(guān)系稱之為參照關(guān)系
舉例:create table info(id number(3) primary key,name varchar2(20),job varchar2(20),birth date);
create table sal(a number(3) references info(id),b number(8,2));--將外鍵約束定義成字段級(jí)約束
create table sal(a number(3),b number(8,2),constraint sal_a_fk foreign key(a) references info(id));
說明:子表sal中的a字段被定義為外鍵,它參照的是主表info中的id字段。這里是把外鍵約束定義成了表級(jí)約束
執(zhí)行完這兩行語句之后,兩個(gè)表中均沒有數(shù)據(jù)。若再執(zhí)行insert into sal(a,b) values(1,2);則會(huì)出現(xiàn)錯(cuò)誤
因?yàn)橄到y(tǒng)并沒有在子表所參照的主表中的某一條記錄上找到id為1的字段的值
此時(shí)可以在剛才的插入語句之前先執(zhí)行insert into info values(1,'Tom','Adv',sysdate);就不會(huì)出現(xiàn)錯(cuò)誤了
如果此時(shí)再執(zhí)行insert into sal(null,8);則該記錄插入成功。外鍵畢竟不同于主鍵,這也不算違背參照規(guī)則
接著再執(zhí)行一次insert into sal(1,8)則記錄插入成功。這種插入null和重復(fù)記錄的方式都是不合理的
為了實(shí)現(xiàn)數(shù)據(jù)的合理化,此時(shí)也可以進(jìn)行其它的限制。即字段a在作為外鍵的同時(shí),還可以進(jìn)行主鍵的限制
即create table sal(a number(3) primary key references info(id),b number(8,2));
或create table sal(a number(3) primary key,b number(8,2),constraint sal_a_fk foreign key(a) references info(id));
檢查約束(check)
特點(diǎn):只能在字段級(jí)定義。它定義每一行(的指定字段)都必須滿足的條件。以條件表達(dá)式的形式給出數(shù)據(jù)需要符合的條件
條件中不允許出現(xiàn)currval,nextval,level,rownum等偽列或sysdate,uid,user,userenv等函數(shù)或?qū)ζ渌侄沃档囊?/P>
currval即序列當(dāng)前的值。nextval即序列生成器的下一個(gè)序列值。level即在層次化查詢的過程中標(biāo)明查詢的層數(shù)
sysdate即當(dāng)前系統(tǒng)時(shí)間。uid即當(dāng)前用戶的id號(hào)。user即當(dāng)前用戶名。userenv用來查詢客戶端的環(huán)境,包括語言或用戶名等等
舉例:create table test1(name varchar2(20) check(length(name)>=6),age number(3) check(age>=0 and age<=120));
create table test1(name varchar2(20) check(name is not null),age number(3));--這就等價(jià)于非空約束了
視圖(View)
概述:視圖由一個(gè)或多個(gè)表(或視圖)中提取數(shù)據(jù)而成。視圖是一種虛擬表。視圖一經(jīng)創(chuàng)建就可以當(dāng)作表來使用
使用視圖可以簡(jiǎn)化復(fù)雜的數(shù)據(jù)查詢。能夠提高運(yùn)行效率??梢云帘螖?shù)據(jù)庫表結(jié)構(gòu),實(shí)現(xiàn)數(shù)據(jù)邏輯獨(dú)立性
還可以限制數(shù)據(jù)庫訪問。也可以在相同數(shù)據(jù)上提供不同的視圖,便于數(shù)據(jù)共享。視圖也可以有主鍵等等
可以通過在create view語句中嵌入子查詢的方式創(chuàng)建視圖
創(chuàng)建:create [or replace] view [schema.]view [(alias[,aliasx]...)] as subquery;
舉例:create or replace view v1(編號(hào),姓名,工資) as select empno,ename,sal from emp where deptno=20;
建議在創(chuàng)建視圖時(shí)加上or replace,即如果存在重名視圖,則替換掉重名視圖
而且不允許在括號(hào)中列出字段類型,因?yàn)榫唧w的字段類型由子查詢的結(jié)果決定
強(qiáng)調(diào):可用force選項(xiàng)強(qiáng)制創(chuàng)建視圖。即無論預(yù)期中的字段或基表是否存在,都要強(qiáng)制創(chuàng)建視圖
也就是先給出一個(gè)視圖的定義。但此時(shí)不能對(duì)這個(gè)連基表都不存在的視圖進(jìn)行查詢,原因不言自明
語法為create [or replace] [force|noforce] view [schema.]view [(alias[,aliasx]...)] as subquery;
比如create or replace force view v2 as select empno,ename,job,sal from emp2 where deptno=20;
假定此時(shí)不存在emp2表,當(dāng)然這些字段存不存在就無從談起了,如果不使用force選項(xiàng),肯定無法創(chuàng)建視圖
缺省為不強(qiáng)制(即noforce)創(chuàng)建視圖。實(shí)際上不建議強(qiáng)制創(chuàng)建視圖
查詢:和查詢表數(shù)據(jù)一樣,可以使用select * from v1;來查詢視圖中的數(shù)據(jù)
它的實(shí)現(xiàn)細(xì)節(jié)是這樣的,當(dāng)數(shù)據(jù)庫服務(wù)器接收到應(yīng)用程序或SQLPlus等客戶端軟件發(fā)送過來的查詢視圖的指令的時(shí)候
首先會(huì)在當(dāng)前方案下尋找名字叫v1的視圖定義,即定義視圖的create語句,也就是create or replace view v1...
找到v1的定義之后,便執(zhí)行定義中的子查詢,再把查詢的結(jié)果返回給客戶端
這意味著每次引用或者訪問視圖的時(shí)候,都會(huì)執(zhí)行一次子查詢,都會(huì)查一下底層的物理表
所以物理表中的任何數(shù)據(jù)更新,都會(huì)立即在視圖的查詢中體現(xiàn)出來
續(xù)一:可以用desc v1查看視圖結(jié)構(gòu)??梢杂胐rop view v1刪除視圖
所謂的臨時(shí)表是在程序運(yùn)行的過程中,根據(jù)需要而臨時(shí)創(chuàng)建的一張表。通常是利用create table創(chuàng)建臨時(shí)表
臨時(shí)表只是臨時(shí)用到它,用完了便刪除。類似于臨時(shí)文件,但臨時(shí)表所保存的是真正的數(shù)據(jù),這跟虛擬表不同
續(xù)二:創(chuàng)建視圖的時(shí)候,也可以不指定字段名。缺省視圖的字段屬性都與子查詢結(jié)果中的字段屬性相同
若子查詢中使用了別名,視圖則采用別名作為它的字段名。而且子查詢中的表達(dá)式或函數(shù)不允許作為視圖的字段名
續(xù)三:實(shí)際上視圖的定義和表的定義一樣,都應(yīng)該在應(yīng)用程序開發(fā)的時(shí)候,在數(shù)據(jù)庫設(shè)計(jì)階段就確定下來它們數(shù)目個(gè)功能
即創(chuàng)建一定數(shù)量的表,以保存最底層基礎(chǔ)的數(shù)據(jù)。并設(shè)定好哪些數(shù)據(jù)需要以視圖的方式交由具體的程序模塊去使用
復(fù)雜:也可以創(chuàng)建復(fù)雜視圖,也就是說子查詢還可以復(fù)雜一些
如果某業(yè)務(wù)經(jīng)常需要查詢統(tǒng)計(jì)信息,那么只需要?jiǎng)?chuàng)建一個(gè)這樣的視圖就可以了,而不必每次都執(zhí)行子查詢以獲得數(shù)據(jù)
比如create or replace v_emp(工號(hào),姓名,職位,年薪,工齡(月),部門編號(hào),部門名稱,)
as select empno, ename, job, sal*12, month_between(sysdate,hiredate), emp.deptno, dname
from emp, dept where emp.deptno=dept.deptno;
更新:在可更新視圖上進(jìn)行DML操縱,可以修改基表中的數(shù)據(jù)。語法與在表上操作相同,分別為insert、update、delete語句
可更新視圖的定義中不能使用分組函數(shù)、group by子句、distinct關(guān)鍵字、rownum偽列,而且字段的定義不能為表達(dá)式
由兩個(gè)以上基表中導(dǎo)出的視圖不可更新?;碇蟹强盏牧性谝晥D定義中未包括,則不可在視圖上進(jìn)行insert操作
這種操作很容易出錯(cuò),實(shí)際上在真實(shí)的開發(fā)中很少這么做,也不建議通過視圖去更新底層數(shù)據(jù)
只讀:在創(chuàng)建視圖時(shí),可使用with read only選項(xiàng)將之設(shè)置為只讀
語法為create [or replace] view [schema.]view [(alias[,aliasx]...)] as subquery [with read only];
臨時(shí):嵌入到SQL語句中的子查詢都是臨時(shí)視圖。比如說用子查詢建表或TopN分析等等所涉及到的子查詢都屬于臨時(shí)視圖
臨時(shí)視圖不是數(shù)據(jù)庫對(duì)象,其定義不會(huì)長久保存在數(shù)據(jù)庫中,本次運(yùn)行后即被清除。它類似于Java語言中創(chuàng)建的匿名類
索引(Index)
概述:是一種用于提升查詢效率的數(shù)據(jù)庫對(duì)象。索引信息與表獨(dú)立存放。它可以通過快速定位數(shù)據(jù)的方法,減少磁盤I/O操作
索引分為兩類,即唯一性索引和非唯一索引。Oracle數(shù)據(jù)庫自動(dòng)使用和維護(hù)索引
創(chuàng)建:自動(dòng)創(chuàng)建:在定義主鍵或唯一鍵約束時(shí),系統(tǒng)會(huì)自動(dòng)在相應(yīng)的字段上創(chuàng)建唯一性索引
手動(dòng)創(chuàng)建:用戶可以在其它列上創(chuàng)建非唯一的索引,以加速查詢
語法為create index [schema.]index on table(column[,column]...);
比如說create index myindex on emp(ename);--查詢表時(shí),若以ename作為查詢條件的話,就很容易定位到某行記錄了
刪除:使用drop index語句刪除索引,如drop index myindex;操作者必須是索引的所有者,或擁有drop該index的權(quán)限
刪除表時(shí),相關(guān)的索引(和約束)將被自動(dòng)刪除,但視圖和序列將保留
原則:適合于創(chuàng)建索引:字段取值的分布范圍很廣。字段中包含大量空值。字段經(jīng)常出現(xiàn)在where子句或連接條件中
表經(jīng)常被訪問,或表數(shù)據(jù)量很大時(shí),且通常每次訪問的數(shù)據(jù)量小于記錄總量的2%~4%
不適合創(chuàng)建索引:表很小。字段不經(jīng)常出現(xiàn)在where子句中。每次訪問的數(shù)據(jù)量大于記錄總數(shù)的2%~4%
表經(jīng)常更新。被索引的字段作為表達(dá)式的一部分被引用
查看:查詢用戶字典視圖user_indexes可得到用戶的所有索引。如select * from user_indexes;
查詢用戶字典視圖user_ind_columns可獲知索引建立在哪些字段上。如select * from user_ind_columns;
函數(shù):基于表達(dá)式的索引被統(tǒng)稱為基于函數(shù)的索引。索引表達(dá)式由表中的字段、常量、SQL函數(shù)和自定義函數(shù)構(gòu)建而成
創(chuàng)建函數(shù)索引語法為create index [schema.]index on table(function(column));
創(chuàng)建函數(shù)索引create index myindex on emp(lower(ename));
使用函數(shù)索引select * from emp where lower(ename)='king';
在使用時(shí),條件中的字段需要與創(chuàng)建索引時(shí)指定的相同,索引才會(huì)起作用。即lower(ename)需要前后一致
序列(Sequence)
概述:是由系統(tǒng)自動(dòng)生成的,不重復(fù)的整數(shù)值。序列是一種數(shù)據(jù)庫對(duì)象,可以被多個(gè)用戶共享。序列可以代替應(yīng)用程序編號(hào)
序列的最典型的用途是作為主鍵值,它對(duì)于每一行必須是唯一的??梢詫?duì)序列值進(jìn)行緩沖存儲(chǔ),以提高訪問效率
但在應(yīng)用程序中生成編號(hào)的話,會(huì)產(chǎn)生性能瓶頸的。也就是說比較麻煩,要確保它的唯一性,還要它的保證效率
所謂的緩沖存儲(chǔ)是指,在使用序列之前,先生成指定的多個(gè)序列的取值作為備用,這樣能提高訪問效率
從實(shí)際應(yīng)用的角度來講,序列的重要性遠(yuǎn)遠(yuǎn)超過視圖和索引,跟約束條件以及表的重要性相當(dāng)
查看:查詢數(shù)據(jù)字典視圖user_sequences可獲得用戶序列信息
創(chuàng)建:create sequence [schema.]sequence [increment by n][start with n]
[{maxvalue n|nomaxvalue}][{minvalue n}|nominvalue][{cycle|nocycle}][{cache n|nocache}][{order|noorder}];
舉例:create sequence mysequence2;
create sequence mysequence1 increment by 1 start with 1 nomaxvalue nocycle;
釋一:increment指明當(dāng)前序列號(hào)遞增的值,缺省為1。start with指定當(dāng)前序列號(hào)的起始值,缺省為1
maxvlaue設(shè)定序列號(hào)的最大值。缺省為nomaxvalue,即沒有最大值。同理minvalue就是設(shè)定序列號(hào)的最小值
cycle設(shè)置在序列達(dá)到最大值之后,是否重新從1開始循環(huán),缺省為nocycle,即不循環(huán)
釋二:實(shí)際上nomaxvalue在實(shí)現(xiàn)的過程中,是有最大值的,大約是10的27次方。同理nominvalue是10的負(fù)27次方
而且在使用序列的時(shí)候,一般不應(yīng)該讓它循環(huán)。避免出現(xiàn)預(yù)期以外的數(shù)據(jù)的重復(fù)
釋三:cache設(shè)置是否進(jìn)行緩沖存儲(chǔ)。它的缺省值不是nocache,而是cache 20
也就是說cache會(huì)先生成20個(gè)序列號(hào)備用,當(dāng)序列號(hào)被用掉了一個(gè)之后,它就會(huì)再補(bǔ)充上一個(gè)
這種通過備用的方式,能夠使程序運(yùn)行效率會(huì)高一點(diǎn)。但是緩存序列號(hào)有可能會(huì)有丟失,倒不是出錯(cuò),只是不連續(xù)而已
釋四:order保證生成的序列號(hào)一定是按照請(qǐng)求的順序。其實(shí)對(duì)于單進(jìn)程或者單線程的程序(即非并發(fā)性的訪問)來說沒有什么差別
若在并發(fā)(也叫并行)工作模式下,多個(gè)請(qǐng)求同時(shí)請(qǐng)求同一個(gè)序列號(hào)的時(shí)候,分配給它們序列號(hào)就有可能是不保證順序的
只是順序不保證,但值還是唯一的,不會(huì)重復(fù)。實(shí)際上它對(duì)我們來說影響不大。比如有兩個(gè)請(qǐng)求先后同時(shí)到達(dá)
如果用order來保證的話,那么先到達(dá)的請(qǐng)求所請(qǐng)求到的序列號(hào)就會(huì)是101,后到達(dá)的就是102
但如果nooder就可能出現(xiàn)先到達(dá)的請(qǐng)求得到的反而是102,后到達(dá)的可能是101,因?yàn)橹虚g有一個(gè)交替的過程
缺省為noorder,即不保證序列號(hào)是按照請(qǐng)求順序生成的
使用:select mysequence1.nextval from dual;--其實(shí)它會(huì)新生成一個(gè)序列號(hào),返回一個(gè)整數(shù)值
select mysequence1.currval from dual;--取出當(dāng)前的序列號(hào)。這種直接的查詢,意義不大
insert into test1 values(mysequence1.nextval,'Tom');--這才是真正的使用序列
nextval偽列用于從指定的序列數(shù)值中取出下一個(gè)值。currval偽列引用的是指定序列的“當(dāng)前值”
使用緩存(cache n)可提高訪問效率。使用nocache和order設(shè)置會(huì)降低運(yùn)行效率
當(dāng)在回滾、系統(tǒng)異常、多個(gè)表同時(shí)使用同一序列等情況下,可能會(huì)使得序列不連續(xù)
修改:alter sequence [schema.]sequence [increment by n][{maxvalue n|nomaxvalue}]
[{minvalue n}|nominvalue][{cycle|nocycle}][{cache n|nocache}][{order|noorder}];
操作者必須是序列的所有者,或者擁有alter該序列的權(quán)限。只有未來再生成的序列數(shù)受影響
修改時(shí)會(huì)進(jìn)行一些驗(yàn)證,比如新的maxvalue如果小于當(dāng)前的序列值就會(huì)報(bào)錯(cuò)。序列的初始值不可更改
為了避免跟現(xiàn)有的序列號(hào)發(fā)生重復(fù),所以序列的初始值不可更改
刪除:使用drop sequence語句刪除序列。操作者須是序列的所有者,或擁有drop該sequence的權(quán)限
同義詞
概述:相當(dāng)于對(duì)象的別名,使用同義詞可以方便訪問其它用戶的對(duì)象,也能夠縮短對(duì)象名字的長度
創(chuàng)建:create [public] synonym synonym fro object;
create synonym gt1 for emp;
使用:select * from gt1;
刪除:drop synonym gt1;
說明:若不加public,那么定義的同義詞則只能在當(dāng)前方案(用戶)的環(huán)境中可用,其它用戶則無法使用該同義詞
而加了public后,其它的方案(用戶)便也可以使用這個(gè)同義詞了
但必須是具有相應(yīng)權(quán)限的用戶(如DBA)才有資格將同義詞定義為public類型
更多信息請(qǐng)查看IT技術(shù)專欄