1. 創(chuàng)建自增主鍵
對(duì)于習(xí)慣了SQL SERVER的圖形化界面操作的SQLer,很長(zhǎng)一段時(shí)間不用oracle,創(chuàng)建一個(gè)帶自增字段的主鍵的表都覺(jué)得很費(fèi)事,但是習(xí)慣了之后也還好,其實(shí)也可 以用EA設(shè)計(jì)好表結(jié)構(gòu)之后,直接生成SQL,這里只是為了演示如何通過(guò)SQL語(yǔ)句創(chuàng)建表。
示例:
1)創(chuàng)建表
Create Table Test ( ID int, Name varchar2(200), Primary Key(ID) )
2)創(chuàng)建自增序列
Create Sequence Test_Sequence
Increment by 1
Start with 1
Nomaxvalue
Nocycle
3)創(chuàng)建觸發(fā)器
Create Or Replace Trigger Test_Trigger
Before Insert On Test
For Each Row
Begin
select Test_Sequence.Nextval Into :new.id From dual;
End;
以上三步就完成了帶有主鍵的自增序列的表的創(chuàng)建。
2. 修改表名、字段名、字段類型、長(zhǎng)度
在實(shí)際的開(kāi)發(fā),會(huì)有遇到需要修改表名、字段的一些情況,下面就這種修改一一說(shuō)明。
1)修改表名: Alter Table Test Rename To Test1
2)修改字段名 Alter Table Test Rename Column Name To Name1
3)新增字段 Alter Table Test Add Age int
4)刪除字段 Alter Table Test drop column Age
5) 修改字段類型、長(zhǎng)度 Alter Table Test Modify Age number(8,2)
3. 時(shí)間、日期相關(guān)
在oracle數(shù)據(jù)庫(kù)中,沒(méi)有專門(mén)的date數(shù)據(jù)類型,有時(shí)候我們只需要存儲(chǔ)日期,不需要時(shí)間,而我們?cè)跀?shù)據(jù)庫(kù)存儲(chǔ)時(shí)都會(huì)自動(dòng)加上日期,針對(duì)于這樣的情況,我們可以通過(guò)以下方式處理:
未使用trunc時(shí),查詢結(jié)果如下: select sysdate from dual 2013-12-22 12:06:16
使用trunc之后,結(jié)果如下: select trunc(sysdate) from dual 2013-12-22
這樣我們可以通過(guò)update語(yǔ)句加上trunc將日期+時(shí)間(2013-12-22 12:03:03)的存儲(chǔ)改成日期(2012-12-22)形式,事實(shí)上數(shù)據(jù)庫(kù)內(nèi)部存儲(chǔ)的也還是“2013-12-22 00:00:00”只不過(guò)在查詢顯示的時(shí)候,展示的是日期形式。
下面講一下,oracle中如何獲取當(dāng)前年、月、日、季度、星期、星期幾。
獲取當(dāng)前年: select to_char(sysdate,‘yy’) from dual
獲取當(dāng)前月: select to_char(sysdate,‘MM’) from dual
獲取當(dāng)前天: select to_char(sysdate,‘dd’) from dual
獲取當(dāng)前季度: select to_char(sysdate,‘Q’) from dual
獲取當(dāng)前第幾個(gè)星期: select to_char(sysdate,‘iw’) from dual
獲取當(dāng)前是星期幾: select to_char(sysdate,‘day’) from dual
4. Top N
在oracle中,不能使用top,但是也有相應(yīng)的替代的解決辦法,就是使用rownum。比如我們想取某些信息集合的top5,具體演示如下:
with as sub ( select *,rownow as PX from Test)
select * from PX where PX<6
這樣就解決了top問(wèn)題,在使用這樣方式查詢top N時(shí),最好先按照某些字段對(duì)數(shù)據(jù)源進(jìn)行排序。
5. 多表關(guān)聯(lián)更新
在實(shí)際的開(kāi)發(fā)中,有時(shí)會(huì)需要將某一個(gè)表的字段內(nèi)容更新為另一個(gè)表的字段內(nèi)容,這個(gè)時(shí)候就會(huì)用到多表關(guān)聯(lián)更新。在SQL Server中,我們可以這樣做:
update t set id=t1.id from Test t inner join Test1 t1 on t.no=t1.no
但是,在Oracle中卻不支持這樣的用法,當(dāng)然也有替代的方法可用,我們可用通過(guò)使用子查詢的方式來(lái)實(shí)現(xiàn),如下:
update Test t set t.id=(select t1.id from Test1 t1 where t1.no=t.no) where exists(select * from Test1 t1 where t1.no=t.no)
需要注意的是子查詢的值,只能是一個(gè)唯一值,不能是多值。后邊的where exists也是很重要的,如果沒(méi)有的話,所得到的結(jié)果可能會(huì)有誤。
還有如果是在數(shù)據(jù)庫(kù)里做更新、刪除、新增的操作,一定要記得commit提交,要不然在程序里是查詢不到已修改的變化。
6. 存儲(chǔ)過(guò)程、函數(shù)
關(guān)于存儲(chǔ)過(guò)程和函數(shù)在數(shù)據(jù)庫(kù)中都是經(jīng)常用到的,在sql server和oracle中語(yǔ)法稍有不太一樣,這里就只做兩個(gè)簡(jiǎn)單的示例即可。
存儲(chǔ)過(guò)程:
一般的語(yǔ)法:
Create Or Replace Procedure 存儲(chǔ)過(guò)程名 (parm1 in type,parm2 out type,....)
as
變量 類型 范圍;--(例:name varchar2(200);)
變量 類型 范圍;--(例:age number(8);)
begin
select * from Test where Name=name; --有判斷的存儲(chǔ)過(guò)程
if(age<10) then .......;
elsif (age>10 and age<20) then ........;
else raise NO_DATA_FOUND;
end if;
Exception
when others then Rollback;
end;
示例:
Create Or Replace TestAge(age in int,agegroup out varchar2(200))
as
age_group varchar2(200);
begion
if(age<=10) then
age_group:="幼年";
elsif(age>10 and age<18)
age_group:="青少年";
else age_group:="成年";
end if;
agegroup:=age_group;
end;
函數(shù):
一般語(yǔ)法:
Create Or Replace Function 函數(shù)名 ( 參數(shù)名 in/out 參數(shù)類型, 參數(shù)名 in/out 參數(shù)類型, ..... )
return 類型
as 參數(shù)名 類型;--(例:name varchar2(200);) ....
begin
......
......
retrun expression;
end 函數(shù)名;
示例:
Create Or Replace Function GetAgeGroup (age in int)
retrun varchar2
as agegroup varchar2(200);
begin if(age<10) then agegroup:="幼年";
elsif(age>=10 and age <18) then agegroup="青年";
else agegroup="成年";
end if; retrun agegroup;
end GetAgeGroup;
這一塊的內(nèi)容沒(méi)有什么別的意義,只是Oracle的函數(shù)和存儲(chǔ)過(guò)程跟sql的有些不同,僅供參考,區(qū)分使用。
7. 索引
關(guān)于索引,即使在sql server中一般也很少使用,因?yàn)閿?shù)據(jù)量還沒(méi)有那么大,這次項(xiàng)目中因?yàn)闋砍兜臄?shù)據(jù)量比較大,即使在oracle,查詢、檢索速度還是不行,所以需要?jiǎng)?chuàng)建 索引。但是索引創(chuàng)建之后,跟沒(méi)創(chuàng)建沒(méi)有什么差別,后來(lái)經(jīng)過(guò)分析才得知,oracle 中的索引的創(chuàng)建還是有很多的規(guī)矩的,下面就簡(jiǎn)要是列一下需要注意的事項(xiàng)。
1)索引應(yīng)該在SQL語(yǔ)句中“Where”或者“and”部分涉及的表的列創(chuàng)建。
2)Order by中用索引。需要注意的是Order by中所有的列都包含在相同的索引中并保持在索引中的排列順序,且order by中所有的列必須定義為非空,否則索引無(wú)效。
3)避免改變索引列的類型。
例如:select * from EMP where EMP_TYPE='123'
事實(shí)上oracle在執(zhí)行的時(shí)候,會(huì)執(zhí)行如下語(yǔ)句:
select * from EMP where EMP_TYPE=to_number('123')
這樣類型轉(zhuǎn)化并沒(méi)有發(fā)生在索引列上,所以索引仍舊有效,但是,如果寫(xiě)成這樣,索引就會(huì)失效的。
select * from EMP where to_number(EMP_TYPE)=123
因?yàn)樗饕械念愋桶l(fā)生了變化,所以索引失效了。
4)在Where子句中需要特別注意的是,不是所有的索引列都會(huì)有效。
例如:
a)在where 子句中使用了 “!=”這樣索引也是無(wú)效的,
b)除此之外還有使用“||"字符拼接,也會(huì)導(dǎo)致索引失效。
c) 還有相同索引列也不能用來(lái)比較,也會(huì)導(dǎo)致索引失效。
d) IS NULL 和 IS NOT NULL也會(huì)導(dǎo)致索引失效。
e) 函數(shù)的使用,也會(huì)導(dǎo)致索引失效
5)在經(jīng)常用在連接上的列上創(chuàng)建索引,可以加快連接的速度,這些列主要是一些外鍵。
6)在主鍵列上創(chuàng)建索引,可以強(qiáng)制該列的唯一性并且組織表中的數(shù)據(jù)的排列結(jié)構(gòu)。
7)對(duì)于列值經(jīng)常修改變動(dòng)的列,不適合創(chuàng)建索引,因?yàn)樵黾铀饕龝?huì)降低修改性能,同樣,增加修改性能會(huì)降低索引性能。
8)對(duì)于只有很少數(shù)據(jù)值的列也不應(yīng)該增加索引,因?yàn)榻Y(jié)果集的數(shù)據(jù)行占據(jù)了表中數(shù)據(jù)行的很大比例,增加索引并不能增加檢索速度。
聯(lián)系客服