------------------------2013-5-9------------------------
索引的建立情況:經(jīng)常用于查詢,排序和分組的列(即經(jīng)常在where,order或group by子句中出現(xiàn)的列)
主鍵索引和復(fù)合索引。
desc student;
create index i_stu_name on student(STU_NAME);
--刪除索引,當(dāng)表結(jié)構(gòu)被刪除時(shí),與其所有的索引都會(huì)隨之刪除。
drop index i_stu_name;
--查詢索引的語(yǔ)句,表名必須大寫,否則查詢不到值。
select table_name, index_name,status from all_indexes where table_name = 'STUDENT';
select index_name,column_name,column_position from all_ind_columns where table_name='STUDENT';
索引的特點(diǎn):
1.不同值較多上建立索引,不同值少的列上不要建。如性別列只有男與女兩個(gè)值,因此就沒(méi)有必要建立索引。(bitmap)
2.索引上面加表達(dá)式,索引不能正常使用。 (函數(shù)索引)
3.where子句中如果使用in,or,like,!=,均會(huì)導(dǎo)致索引不能正常使用。
4.使用復(fù)合索引進(jìn)行查詢時(shí)必須使用前置列。
寫where條件時(shí),有索引的判斷在前,其他字段的判斷在后。如果where條件中用到復(fù)合索引,按照索引列在復(fù)合索引中出現(xiàn)的順序來(lái)依次寫where條件。
使用多表連接時(shí),在from子句中,將記錄數(shù)少的表放在后面,可提高執(zhí)行效率。
首先從大表中查詢需要的記錄,此時(shí)記錄數(shù)已經(jīng)被大量縮小,然后再和其他兩個(gè)表連接,速度會(huì)得到很大改善!
查詢數(shù)量較大時(shí),使用表連接代替in,exists,not in,not exists等。
然后不斷的積累經(jīng)驗(yàn),并且注意不能一概而論。
全局索引,本地索引,全局分區(qū)索引。
--創(chuàng)建臨時(shí)表
--create global temporary table myemp as select * from student;
select * from myemp;
desc myemp;
--刪除臨時(shí)表
drop table myemp;
--增加一個(gè)列
--alter table student add(deptno varchar2(6));
--修改一個(gè)列
--alter table student modify(deptno varchar2(10));
--刪除表中的一個(gè)列,oracle8.0.5版本以上方可。
alter table student drop column deptno;
desc student;
-->3.2.4使用CHECK做限制條件
------------------------2013-5-10------------------------
--創(chuàng)建員工宿舍表
create table lodging(
? lodging char(18) primary key,
? name varchar2(10)
);
--創(chuàng)建工人表
create table worker(
? empno number(4) primary key,
? name varchar2(10),
? age number(2) check(age between 18 and 60),?? --check檢查約束
? lodging char(18) references lodging(lodging)? --外鍵關(guān)聯(lián)
);
--員工基本信息表
create table emp3(
? empno number(4) constraint abc primary key,
? ename varchar2(10),
? job varchar2(10),
? sex char(2) check(sex='男' or sex='女'),
? mgr number(4),
? hiredate date,
? sal number(7,2),
? comm number(7,2),
? deptno number(2),
? check (sal+comm > 0 and sal+comm < 5000)
);
--使用unrecoverable創(chuàng)建表,nolodging lodging
create table table_copy as select * from emp3 unrecoverable;
--使用nolodging關(guān)鍵字創(chuàng)建
create table table_copy2 as select * from emp3 nolodging;
--使用lodging關(guān)鍵字創(chuàng)建
create table table_copy3 as select * from emp3 lodging;
--查詢表空間
select tablespace_name,table_name,initial_extent from user_tables;
create table table3(
? xm varchar2(12),
? sal number(4,2)
);
//修改表結(jié)構(gòu)
alter table table3 modify sal number(6,2);
insert into table3 values('gao',1111.11);
insert into table3 values('gao',1111.11);
insert into table3 values('zhu',5555.55);
insert into table3 values('zhu',55551.55);
ORA-01438: 值大于此列指定的允許精確度
##定點(diǎn)數(shù)的精度(p)和刻度(s)遵循以下規(guī)則##
1.當(dāng)一個(gè)數(shù)的整數(shù)部分的長(zhǎng)度 > p-s時(shí),Oracle會(huì)報(bào)錯(cuò)。
alter table table3 add sal2 number(6,2);???? -->1111.11
2.當(dāng)一個(gè)數(shù)的小數(shù)部分的長(zhǎng)度 > s時(shí),Oracle就會(huì)舍入。??
insert into table3 values('zhu',5555.5589);???????? -->5555.56
3.當(dāng)s(scale)為負(fù)數(shù)時(shí),Oracle就對(duì)小數(shù)點(diǎn)左邊的s個(gè)數(shù)字進(jìn)行舍入。
alter table table3 add sal2 number(2,-2);
insert into table3 values('zhu',1111.11,5609.12);?? -->5600
insert into table3 values('zhu',1111.11,5678.78);?? -->5700
insert into table3 values('zhu',1111.11,609.12);??? -->600
insert into table3 values('zhu',1111.11,63.12);???? -->100
insert into table3 values('zhu',1111.11,43.12);???? -->0
4.當(dāng)s > p時(shí),p表示小數(shù)點(diǎn)后第s位向左最多可以有多少位數(shù)字,如果大于p則Oracle報(bào)錯(cuò),小數(shù)點(diǎn)后s位向右的數(shù)字被舍入。
--更加明白的說(shuō)法--
--當(dāng)p小于s時(shí)候,表示數(shù)字是絕對(duì)值小于1的數(shù)字,且從小數(shù)點(diǎn)右邊開(kāi)始的前s-p 位必須是0,保留s位小數(shù)。
insert into table3 values('zhu',1111.11,43.12,0.00126);? -->0.0013
insert into table3 values('zhu',1111.11,43.12,0.00996);? -->報(bào)錯(cuò),這樣會(huì)進(jìn)位,絕對(duì)值大于1。
#http://ilinux.iteye.com/blog/289550#
--對(duì)表中的列表示為不使用
--alter table table3 set unused(sal3);
--創(chuàng)建主鍵
create table dept1(
? deptno number(2),
? dname varchar2(10),
? loc varchar2(20),
? constraint pk_dept primary key(deptno)
);
--增加表的主鍵
--alter table table3 add ( pk_key primary key (sal) );
--ORA-00907: 缺少右括號(hào) ??
alter table table3 add(pk_key primary key (xm));? --可能跟表有關(guān)系
alter table dept1 add primary key(deptno);??????? --系統(tǒng)默認(rèn)的名稱
alter table dept1 add constraint pk_dept primary key(deptno); --constraint必須要寫--
#http://miracle.blog.51cto.com/255044/55315#
--主鍵不可用
create table dept2(
? deptno number(2) primary key,
? dname varchar2(10)
)
disable primary key;
--啟用取消的主鍵,才可以建立外鍵關(guān)系,否則報(bào)錯(cuò)。
alter table dept2 enable primary key;
--ORA-02270: 此列列表的唯一或主鍵不匹配
create table table4(
? id varchar2(8),
? deptno number(2) references dept2(deptno)?? --外鍵
);
唯一索引和復(fù)合主鍵
e_name varchar2(8) constraint un_dname unique,
name varchar2(10) constraint pt_1 primary key,
表結(jié)構(gòu)最后一行寫
constraint pri_3 primary key(deptno)
--外鍵
deptno constraint pri_4 references dept5(deptno);
--創(chuàng)建復(fù)合主鍵
--alter table dept1 add constraint pk_dept primary key(deptno,dname);
alter table dept1 add primary key(deptno,dname);
--創(chuàng)建復(fù)合主鍵 禁用狀態(tài)。
alter table dept1 add primary key(deptno,dname) disable;
--禁用主鍵,如果有一外鍵依賴于該主鍵,則系統(tǒng)會(huì)報(bào)錯(cuò)。
alter table dept1 disable constraint SYS_C002136;? (語(yǔ)法適用于外鍵)
--恢復(fù)主鍵
alter table dept1 enable constraint SYS_C002136;
--刪除主鍵
alter table dept1 drop constraint SYS_C002136;??? (語(yǔ)法適用于外鍵)
--刪除主鍵,將外鍵一起刪除。
alter table dept1 drop constraint pk_2 cascade;
create table dept5(
? deptno varchar(8),
? name varchar(8),
? loc varchar(4),
? constraint pri_3 primary key(deptno)? --建立主鍵
);
create table emp5(
? emptno number(4),
? ename varchar2(10),
? job varchar2(10),
? mgr number(4),
? deptno constraint pri_4 references dept5(deptno)? --外鍵
);
create table emp6(
? emptno number(4),
? ename varchar2(10),
? job varchar2(10),
? mgr number(4),
? deptno, constraint pri_5 foreign key(deptno) references dept5(deptno)? --外鍵,逗號(hào)不能少。
);
create table emp7(
? emptno number(4),
? ename varchar2(10),
? job varchar2(10),
? mgr number(4),
? deptno varchar(8) , constraint pri_6 foreign references dept5(deptno) on delete cascade? --外鍵,使用delete cascade管理引用完整性
);
#索引組織表# 基于主鍵進(jìn)行搜索
create table命令與organization index子句一起用于創(chuàng)建索引組織表。
--表及索引.txt--
--抽象數(shù)據(jù)類型的使用
create type add_type as object(
? street varchar2(10),? --街道名
? city varchar2(10),??? --城市名
? state char(2),??????? --州代碼
? zip?? number????????? --郵編
);
create table customer(
? name varchar2(10),
? address add_type
);
insert into customer values('1',add_type('mystatree','some city','st',10001));
大數(shù)據(jù)類型使用,clob,blob,bfile。? -->ORACLE埃里森1.txt
3.9.1.表和索引數(shù)據(jù)字典
?.DBA_TABLES,ALL_TABLES,USER_TABLES? 存放表的基本信息
?.DBA_INDEXS,ALL_INDEXS,USER_INDEXS? 存放索引的基本信息
?.DBA_IND_COLUMN???????????????????? 存放有索引的列的信息
?.ALL_CONSTRAINTS??????????????????? 存放表的限制信息
?.ALL_COLS_COLUMNS?????????????????? 存放表的列的限制信息
查詢當(dāng)前用戶的基本信息,包括表名,索引名及表空間,存儲(chǔ)參數(shù)。
select tablespace_name,table_name,initial_extent,next_extent from all_tables where owner = user;
--查詢當(dāng)前用戶的限制信息
select owner,constraint_name,table_name from user_constraints;
select search_condition from user_constraints;
SEARCH_CONDITION
--------------------------------------------------------------------------------
sex='男' or sex='女'
sal+comm > 0 and sal+comm < 5000
"ID" IS NOT NULL
"NAME" IS NOT NULL
age between 18 and 60
#創(chuàng)建視圖#
create or replace view viewTitles
as
select title_id,nvl(price,0) price from titles;? --SQL語(yǔ)句--
無(wú)法直接指定一個(gè)分區(qū)數(shù)據(jù)表的多個(gè)分區(qū)中的數(shù)據(jù)時(shí),通過(guò)union關(guān)鍵字將多個(gè)數(shù)據(jù)表分區(qū)聯(lián)結(jié)。
create or replace view viewStus
as
select * from student partition(east)
union
select * from student partition(west);
--通過(guò)視圖來(lái)實(shí)現(xiàn),可以簡(jiǎn)化SQL命令。
select * from viewStus;
查看用戶創(chuàng)建的視圖信息(user_views)
select * from user_views;
刪除試圖
delete view viewStus;
--查看用戶序列
desc user_sequences;
--查詢簇信息
desc user_clusters;
##簇##
簇
簇表
簇索引
簇表其實(shí)就是一組表,是一組共享相同數(shù)據(jù)塊的多個(gè)表組成。將經(jīng)常一起使用的表組合在一起成為簇可以提高處理效率。
在一個(gè)簇中的表就叫做簇表。建立順序是:簇 ->簇表 ->數(shù)據(jù) ->簇索引。
唯一索引
組合索引
反向鍵索引:在創(chuàng)建索引時(shí)使用reverse關(guān)鍵字。
位圖索引:為低基數(shù)列創(chuàng)建,bitmap index語(yǔ)句用于創(chuàng)建位圖索引。
?? 優(yōu)點(diǎn):減少響應(yīng)時(shí)間,降低空間占用。
?? --無(wú)須頻繁的修改造成死鎖--
當(dāng)索引被創(chuàng)建后,由Oracle自動(dòng)維護(hù)。
create table student8(
? stu_no number(2),
? stu_name varchar2(8)
);
--在指定的字段上創(chuàng)建唯一索引
create unique index idx_stu_no
on student8(stu_no);
insert into student8 values(1,'ANiu');
--ORA-00001: 違反唯一約束條件 (NEWLIFEYHJ.IDX_STU_NO)
insert into student8 values(1,'AZhu');
select * from student8;
數(shù)據(jù)庫(kù)對(duì)象
同義詞:數(shù)據(jù)庫(kù)對(duì)象的替換名稱,隱藏了對(duì)象的名稱和所有者。
序列:生成唯一,連續(xù)的整數(shù)。
-- 獲取序列的下一個(gè)值
-- 序列的第一個(gè)值必須通過(guò)NextValue來(lái)獲得
select seqTest1.NextVal from dual;
-- 獲取序列的當(dāng)前值
select seqTest1.CurrVal from dual;
視圖:經(jīng)過(guò)定制的表示方式,用于顯示來(lái)自一個(gè)或多個(gè)表的數(shù)據(jù)。
索引:加快了SQL語(yǔ)句的執(zhí)行速度。多個(gè)列上的創(chuàng)建的索引稱為“組合索引”。
????? 在索引組織表中,數(shù)據(jù)訪問(wèn)基于主鍵值。
簇:一組表,這些表?yè)碛泄擦校⑶乙黄鹗褂谩?
create
alter
drop
------------------------2013-5-14------------------------
普通表與索引表的對(duì)比
普通表???索引編排表
rowid唯一的標(biāo)識(shí)行?主鍵唯一的標(biāo)識(shí)行
隱式的rowid列??沒(méi)有隱式的rowid列
基于rowid的訪問(wèn)??基于主鍵的訪問(wèn)
順序掃描返回所有行?完全索引掃描返回所有行,并按主鍵順序排列
普通表可以存儲(chǔ)在簇中?索引組織表不能存儲(chǔ)在簇中
支持分發(fā),復(fù)制和分區(qū)?不支持分發(fā),復(fù)制和分區(qū)
區(qū)別:rowid與主鍵,順序掃描和索引掃描,簇,分發(fā),復(fù)制和分區(qū)。
基于函數(shù)的索引
基于一個(gè)或多個(gè)列上的函數(shù)或表達(dá)式創(chuàng)建的索引
表達(dá)式中不能包含聚集函數(shù)(sum,count,avg,min,max)
不能在lob,ref或嵌套表列上創(chuàng)建
鍵壓縮索引:compress子句用于創(chuàng)建這種索引。
分區(qū)索引
分區(qū)索引的類型
本地索引
全局索引
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
