永不放棄,一切皆有可能!!!
只為成功找方法,不為失敗找借口!
Oracle常用知識小總結
1. 創建自增主鍵
對於習慣了SQL SERVER的圖形化界面操作的SQLer,很長一段時間不用oracle,創建一個帶自增字段的主鍵的表都覺得很費事,但是習慣了之后也還好,其實也可 以用EA設計好表結構之后,直接生成SQL,這里只是為了演示如何通過SQL語句創建表。
示例:
1)創建表
Create Table Test ( ID int, Name varchar2(200), Primary Key(ID) )
2)創建自增序列
Create Sequence Test_Sequence
Increment by 1
Start with 1
Nomaxvalue
Nocycle
3)創建觸發器
Create Or Replace Trigger Test_Trigger
Before Insert On Test
For Each Row
Begin
select Test_Sequence.Nextval Into :new.id From dual;
End;
以上三步就完成了帶有主鍵的自增序列的表的創建。
2. 修改表名、字段名、字段類型、長度
在實際的開發,會有遇到需要修改表名、字段的一些情況,下面就這種修改一一說明。
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) 修改字段類型、長度 Alter Table Test Modify Age number(8,2)
3. 時間、日期相關
在oracle數據庫中,沒有專門的date數據類型,有時候我們只需要存儲日期,不需要時間,而我們在數據庫存儲時都會自動加上日期,針對於這樣的情況,我們可以通過以下方式處理:
未使用trunc時,查詢結果如下: select sysdate from dual 2013-12-22 12:06:16
使用trunc之后,結果如下: select trunc(sysdate) from dual 2013-12-22
這樣我們可以通過update語句加上trunc將日期+時間(2013-12-22 12:03:03)的存儲改成日期(2012-12-22)形式,事實上數據庫內部存儲的也還是“2013-12-22 00:00:00”只不過在查詢顯示的時候,展示的是日期形式。
下面講一下,oracle中如何獲取當前年、月、日、季度、星期、星期幾。
獲取當前年: select to_char(sysdate,‘yy’) from dual
獲取當前月: select to_char(sysdate,‘MM’) from dual
獲取當前天: select to_char(sysdate,‘dd’) from dual
獲取當前季度: select to_char(sysdate,‘Q’) from dual
獲取當前第幾個星期: select to_char(sysdate,‘iw’) from dual
獲取當前是星期幾: select to_char(sysdate,‘day’) from dual
4. Top N
在oracle中,不能使用top,但是也有相應的替代的解決辦法,就是使用rownum。比如我們想取某些信息集合的top5,具體演示如下:
with as sub ( select *,rownow as PX from Test)
select * from PX where PX<6
這樣就解決了top問題,在使用這樣方式查詢top N時,最好先按照某些字段對數據源進行排序。
5. 多表關聯更新
在實際的開發中,有時會需要將某一個表的字段內容更新為另一個表的字段內容,這個時候就會用到多表關聯更新。在SQL Server中,我們可以這樣做:
update t set id=t1.id from Test t inner join Test1 t1 on t.no=t1.no
但是,在Oracle中卻不支持這樣的用法,當然也有替代的方法可用,我們可用通過使用子查詢的方式來實現,如下:
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)
需要注意的是子查詢的值,只能是一個唯一值,不能是多值。后邊的where exists也是很重要的,如果沒有的話,所得到的結果可能會有誤。
還有如果是在數據庫里做更新、刪除、新增的操作,一定要記得commit提交,要不然在程序里是查詢不到已修改的變化。
6. 存儲過程、函數
關於存儲過程和函數在數據庫中都是經常用到的,在sql server和oracle中語法稍有不太一樣,這里就只做兩個簡單的示例即可。
存儲過程:
一般的語法:
Create Or Replace Procedure 存儲過程名 (parm1 in type,parm2 out type,....)
as
變量 類型 范圍;--(例:name varchar2(200);)
變量 類型 范圍;--(例:age number(8);)
begin
select * from Test where Name=name; --有判斷的存儲過程
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;
函數:
一般語法:
Create Or Replace Function 函數名 ( 參數名 in/out 參數類型, 參數名 in/out 參數類型, ..... )
return 類型
as 參數名 類型;--(例:name varchar2(200);) ....
begin
......
......
retrun expression;
end 函數名;
示例:
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;
這一塊的內容沒有什么別的意義,只是Oracle的函數和存儲過程跟sql的有些不同,僅供參考,區分使用。
7. 索引
關於索引,即使在sql server中一般也很少使用,因為數據量還沒有那么大,這次項目中因為牽扯的數據量比較大,即使在oracle,查詢、檢索速度還是不行,所以需要創建 索引。但是索引創建之后,跟沒創建沒有什么差別,后來經過分析才得知,oracle 中的索引的創建還是有很多的規矩的,下面就簡要是列一下需要注意的事項。
1)索引應該在SQL語句中“Where”或者“and”部分涉及的表的列創建。
2)Order by中用索引。需要注意的是Order by中所有的列都包含在相同的索引中並保持在索引中的排列順序,且order by中所有的列必須定義為非空,否則索引無效。
3)避免改變索引列的類型。
例如:select * from EMP where EMP_TYPE='123'
事實上oracle在執行的時候,會執行如下語句:
select * from EMP where EMP_TYPE=to_number('123')
這樣類型轉化並沒有發生在索引列上,所以索引仍舊有效,但是,如果寫成這樣,索引就會失效的。
select * from EMP where to_number(EMP_TYPE)=123
因為索引列的類型發生了變化,所以索引失效了。
4)在Where子句中需要特別注意的是,不是所有的索引列都會有效。
例如:
a)在where 子句中使用了 “!=”這樣索引也是無效的,
b)除此之外還有使用“||"字符拼接,也會導致索引失效。
c) 還有相同索引列也不能用來比較,也會導致索引失效。
d) IS NULL 和 IS NOT NULL也會導致索引失效。
e) 函數的使用,也會導致索引失效
5)在經常用在連接上的列上創建索引,可以加快連接的速度,這些列主要是一些外鍵。
6)在主鍵列上創建索引,可以強制該列的唯一性並且組織表中的數據的排列結構。
7)對於列值經常修改變動的列,不適合創建索引,因為增加索引會降低修改性能,同樣,增加修改性能會降低索引性能。
8)對於只有很少數據值的列也不應該增加索引,因為結果集的數據行占據了表中數據行的很大比例,增加索引並不能增加檢索速度。