------------------------2013-5-9------------------------
索引的建立情況:經常用于查詢,排序和分組的列(即經常在where,order或group by子句中出現的列)
主鍵索引和復合索引。
desc student;
create index i_stu_name on student(STU_NAME);
--刪除索引,當表結構被刪除時,與其所有的索引都會隨之刪除。
drop index i_stu_name;
--查詢索引的語句,表名必須大寫,否則查詢不到值。
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';
索引的特點:
1.不同值較多上建立索引,不同值少的列上不要建。如性別列只有男與女兩個值,因此就沒有必要建立索引。(bitmap)
2.索引上面加表達式,索引不能正常使用。 (函數索引)
3.where子句中如果使用in,or,like,!=,均會導致索引不能正常使用。
4.使用復合索引進行查詢時必須使用前置列。
寫where條件時,有索引的判斷在前,其他字段的判斷在后。如果where條件中用到復合索引,按照索引列在復合索引中出現的順序來依次寫where條件。
使用多表連接時,在from子句中,將記錄數少的表放在后面,可提高執行效率。
首先從大表中查詢需要的記錄,此時記錄數已經被大量縮小,然后再和其他兩個表連接,速度會得到很大改善!
查詢數量較大時,使用表連接代替in,exists,not in,not exists等。
然后不斷的積累經驗,并且注意不能一概而論。
全局索引,本地索引,全局分區索引。
--創建臨時表
--create global temporary table myemp as select * from student;
select * from myemp;
desc myemp;
--刪除臨時表
drop table myemp;
--增加一個列
--alter table student add(deptno varchar2(6));
--修改一個列
--alter table student modify(deptno varchar2(10));
--刪除表中的一個列,oracle8.0.5版本以上方可。
alter table student drop column deptno;
desc student;
-->3.2.4使用CHECK做限制條件
------------------------2013-5-10------------------------
--創建員工宿舍表
create table lodging(
? lodging char(18) primary key,
? name varchar2(10)
);
--創建工人表
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)? --外鍵關聯
);
--員工基本信息表
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創建表,nolodging lodging
create table table_copy as select * from emp3 unrecoverable;
--使用nolodging關鍵字創建
create table table_copy2 as select * from emp3 nolodging;
--使用lodging關鍵字創建
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)
);
//修改表結構
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: 值大于此列指定的允許精確度
##定點數的精度(p)和刻度(s)遵循以下規則##
1.當一個數的整數部分的長度 > p-s時,Oracle會報錯。
alter table table3 add sal2 number(6,2);???? -->1111.11
2.當一個數的小數部分的長度 > s時,Oracle就會舍入。??
insert into table3 values('zhu',5555.5589);???????? -->5555.56
3.當s(scale)為負數時,Oracle就對小數點左邊的s個數字進行舍入。
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.當s > p時,p表示小數點后第s位向左最多可以有多少位數字,如果大于p則Oracle報錯,小數點后s位向右的數字被舍入。
--更加明白的說法--
--當p小于s時候,表示數字是絕對值小于1的數字,且從小數點右邊開始的前s-p 位必須是0,保留s位小數。
insert into table3 values('zhu',1111.11,43.12,0.00126);? -->0.0013
insert into table3 values('zhu',1111.11,43.12,0.00996);? -->報錯,這樣會進位,絕對值大于1。
#http://ilinux.iteye.com/blog/289550#
--對表中的列表示為不使用
--alter table table3 set unused(sal3);
--創建主鍵
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: 缺少右括號 ??
alter table table3 add(pk_key primary key (xm));? --可能跟表有關系
alter table dept1 add primary key(deptno);??????? --系統默認的名稱
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;
--啟用取消的主鍵,才可以建立外鍵關系,否則報錯。
alter table dept2 enable primary key;
--ORA-02270: 此列列表的唯一或主鍵不匹配
create table table4(
? id varchar2(8),
? deptno number(2) references dept2(deptno)?? --外鍵
);
唯一索引和復合主鍵
e_name varchar2(8) constraint un_dname unique,
name varchar2(10) constraint pt_1 primary key,
表結構最后一行寫
constraint pri_3 primary key(deptno)
--外鍵
deptno constraint pri_4 references dept5(deptno);
--創建復合主鍵
--alter table dept1 add constraint pk_dept primary key(deptno,dname);
alter table dept1 add primary key(deptno,dname);
--創建復合主鍵 禁用狀態。
alter table dept1 add primary key(deptno,dname) disable;
--禁用主鍵,如果有一外鍵依賴于該主鍵,則系統會報錯。
alter table dept1 disable constraint SYS_C002136;? (語法適用于外鍵)
--恢復主鍵
alter table dept1 enable constraint SYS_C002136;
--刪除主鍵
alter table dept1 drop constraint SYS_C002136;??? (語法適用于外鍵)
--刪除主鍵,將外鍵一起刪除。
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)? --外鍵,逗號不能少。
);
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管理引用完整性
);
#索引組織表# 基于主鍵進行搜索
create table命令與organization index子句一起用于創建索引組織表。
--表及索引.txt--
--抽象數據類型的使用
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));
大數據類型使用,clob,blob,bfile。? -->ORACLE埃里森1.txt
3.9.1.表和索引數據字典
?.DBA_TABLES,ALL_TABLES,USER_TABLES? 存放表的基本信息
?.DBA_INDEXS,ALL_INDEXS,USER_INDEXS? 存放索引的基本信息
?.DBA_IND_COLUMN???????????????????? 存放有索引的列的信息
?.ALL_CONSTRAINTS??????????????????? 存放表的限制信息
?.ALL_COLS_COLUMNS?????????????????? 存放表的列的限制信息
查詢當前用戶的基本信息,包括表名,索引名及表空間,存儲參數。
select tablespace_name,table_name,initial_extent,next_extent from all_tables where owner = user;
--查詢當前用戶的限制信息
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
#創建視圖#
create or replace view viewTitles
as
select title_id,nvl(price,0) price from titles;? --SQL語句--
無法直接指定一個分區數據表的多個分區中的數據時,通過union關鍵字將多個數據表分區聯結。
create or replace view viewStus
as
select * from student partition(east)
union
select * from student partition(west);
--通過視圖來實現,可以簡化SQL命令。
select * from viewStus;
查看用戶創建的視圖信息(user_views)
select * from user_views;
刪除試圖
delete view viewStus;
--查看用戶序列
desc user_sequences;
--查詢簇信息
desc user_clusters;
##簇##
簇
簇表
簇索引
簇表其實就是一組表,是一組共享相同數據塊的多個表組成。將經常一起使用的表組合在一起成為簇可以提高處理效率。
在一個簇中的表就叫做簇表。建立順序是:簇 ->簇表 ->數據 ->簇索引。
唯一索引
組合索引
反向鍵索引:在創建索引時使用reverse關鍵字。
位圖索引:為低基數列創建,bitmap index語句用于創建位圖索引。
?? 優點:減少響應時間,降低空間占用。
?? --無須頻繁的修改造成死鎖--
當索引被創建后,由Oracle自動維護。
create table student8(
? stu_no number(2),
? stu_name varchar2(8)
);
--在指定的字段上創建唯一索引
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;
數據庫對象
同義詞:數據庫對象的替換名稱,隱藏了對象的名稱和所有者。
序列:生成唯一,連續的整數。
-- 獲取序列的下一個值
-- 序列的第一個值必須通過NextValue來獲得
select seqTest1.NextVal from dual;
-- 獲取序列的當前值
select seqTest1.CurrVal from dual;
視圖:經過定制的表示方式,用于顯示來自一個或多個表的數據。
索引:加快了SQL語句的執行速度。多個列上的創建的索引稱為“組合索引”。
????? 在索引組織表中,數據訪問基于主鍵值。
簇:一組表,這些表擁有公共列,并且一起使用。
create
alter
drop
------------------------2013-5-14------------------------
普通表與索引表的對比
普通表???索引編排表
rowid唯一的標識行?主鍵唯一的標識行
隱式的rowid列??沒有隱式的rowid列
基于rowid的訪問??基于主鍵的訪問
順序掃描返回所有行?完全索引掃描返回所有行,并按主鍵順序排列
普通表可以存儲在簇中?索引組織表不能存儲在簇中
支持分發,復制和分區?不支持分發,復制和分區
區別:rowid與主鍵,順序掃描和索引掃描,簇,分發,復制和分區。
基于函數的索引
基于一個或多個列上的函數或表達式創建的索引
表達式中不能包含聚集函數(sum,count,avg,min,max)
不能在lob,ref或嵌套表列上創建
鍵壓縮索引:compress子句用于創建這種索引。
分區索引
分區索引的類型
本地索引
全局索引
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

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