我個人關(guān)于ORACLE課程提綱的總結(jié)
1.簡單介紹下ORACLE的總體框架
oracle的體系很龐大,要學(xué)習(xí)它,首先讓我們了解oracle的框架。在這里,簡要的講一下oracle的架構(gòu)
1、物理結(jié)構(gòu)(由控制文件、數(shù)據(jù)文件、重做日志文件、參數(shù)文件、歸檔文件、密
碼文件組成)
控制文件:包含維護和驗證數(shù)據(jù)庫完整性的必要信息、一個數(shù)據(jù)庫至少需要一
個控制文件
數(shù)據(jù)文件:存儲數(shù)據(jù)的文件
重做日志文件:含對數(shù)據(jù)庫所做的更改記錄,這樣萬一出現(xiàn)故障可以啟用數(shù)據(jù)恢復(fù)。一個數(shù)據(jù)庫至少需要兩個重做日志文件
參數(shù)文件:定義Oracle例程的特性,例如它包含調(diào)整SGA中一些內(nèi)存結(jié)構(gòu)大小的參數(shù)
歸檔文件:是重做日志文件的脫機副本,這些副本可能對于從介質(zhì)失敗中進行恢復(fù)很必要。
密碼文件:認證哪些用戶有權(quán)限啟動和關(guān)閉Oracle例程
2、邏輯結(jié)構(gòu)(表空間、段、區(qū)、塊)
表空間:是數(shù)據(jù)庫中的基本邏輯結(jié)構(gòu),一系列數(shù)據(jù)文件的集合。段:是對象在數(shù)據(jù)庫中占用的空間
區(qū):是為數(shù)據(jù)一次性預(yù)留的一個較大的存儲空間
塊:ORACLE最基本的存儲單位,在建立數(shù)據(jù)庫的時候指定
3、內(nèi)存分配(SGA和PGA)
SGA:是用于存儲數(shù)據(jù)庫信息的內(nèi)存區(qū),該信息為數(shù)據(jù)庫進程所共享。它包含
Oracle服務(wù)器的數(shù)據(jù)和控制信息,它是在Oracle服務(wù)器所駐留的計算機的實際內(nèi)存中得以分配,如果實際內(nèi)存不夠再往虛擬內(nèi)存中寫。
PGA:包含單個服務(wù)器進程或單個后臺進程的數(shù)據(jù)和控制信息,與幾個進程共享的SGA正相反PGA是只被一個進程使用的區(qū)域,PGA在創(chuàng)建進程時分配在
終止進程時回收
4、后臺進程(數(shù)據(jù)寫進程、日志寫進程、系統(tǒng)監(jiān)控、進程監(jiān)控、檢查點進程、歸
檔進程、服務(wù)進程、用戶進程)
數(shù)據(jù)寫進程:負責(zé)將更改的數(shù)據(jù)從數(shù)據(jù)庫緩沖區(qū)高速緩存寫入數(shù)據(jù)文件日志寫進程:將重做日志緩沖區(qū)中的更改寫入在線重做日志文件
系統(tǒng)監(jiān)控:檢查數(shù)據(jù)庫的一致性如有必要還會在數(shù)據(jù)庫打開時啟動數(shù)據(jù)庫的恢復(fù)
進程監(jiān)控:負責(zé)在一個Oracle進程失敗時清理資源
檢查點進程:負責(zé)在每當(dāng)緩沖區(qū)高速緩存中的更改永久地記錄在數(shù)據(jù)庫中時,更新控制文件和數(shù)據(jù)文件中的數(shù)據(jù)庫狀態(tài)信息。
歸檔進程:在每次日志切換時把已滿的日志組進行備份或歸檔服務(wù)進程:用戶進程服務(wù)。
用戶進程:在客戶端,負責(zé)將用戶的SQL語句傳遞給服務(wù)進程,并從服務(wù)器段拿回查詢數(shù)據(jù)。
5、oracle例程:Oracle例程由SGA內(nèi)存結(jié)構(gòu)和用于管理數(shù)據(jù)庫的后臺進程組成。
例程一次只能打開和使用一個數(shù)據(jù)庫。6、SCN(SystemChangeNumber):系統(tǒng)改變號,一個由系統(tǒng)內(nèi)部維護的序列號。當(dāng)系統(tǒng)需要更新的時候自動增加,他是系統(tǒng)中維持數(shù)據(jù)的一致性和順序恢復(fù)的重要標志。
2.介紹項目中常用的標準SQL知識點
oracle左/右/全連接
innerjoin--內(nèi)連接和where相同;相當(dāng)于join;
leftjoin--左向外連接,返回左邊表所有符合條件的rightjoin--右向外連接,返回右邊表所有符合條件的
fulljoin--完整外部連接,左向外連接和右向外連接的合集--建立測試數(shù)據(jù)
createtablea(idnumber);createtableb(idnumber);createtablec(idnumber);
insertintoavalues(1);insertintoavalues(2);insertintoavalues(3);insertintobvalues(1);insertintobvalues(2);insertintobvalues(4);insertintocvalues(1);--左:
--主流數(shù)據(jù)庫通用的方法
select*fromaleftjoinbona.id=b.id;
--Oracle特有的方法--最好不要用這樣,不便于sql語句的移植。select*froma,bwherea.id=b.id(+);IDID
--------------------11223
--右:
--主流數(shù)據(jù)庫通用的方法
select*fromarightjoinbona.id=b.id;--Oracle特有的方法
select*froma,bwherea.id(+)=b.id;
IDID
--------------------1124--內(nèi)
--主流數(shù)據(jù)庫通用的方法
select*fromajoinbona.id=b.id;--where關(guān)聯(lián)
select*froma,bwherea.id=b.id;
IDID
--------------------11
22--全外
--主流數(shù)據(jù)庫通用的方法
select*fromafulljoinbona.id=b.id;--Oracle特有的方法select*froma,b
wherea.id=b.id(+)union
select*froma,b
wherea.id(+)=b.id;
IDID
--------------------11223
4對于多表查詢,如下:select*froma
leftjoinbona.id=b.idleftjoinconc.id=b.id;
IDID
--------------------11223
相當(dāng)于先進行第一個leftjoin,得到結(jié)果集A(3條記錄);結(jié)果集A再與第二個leftjoin進行查詢;select*froma
leftjoinbona.id=b.idrightjoinconc.id=b.id;相當(dāng)于先進行第一個leftjoin,得到結(jié)果集A(3條記錄);結(jié)果集A再與rightjoin進行查詢,即以c表為主,因為C表只有一個記錄,所以最終才顯示一條記錄;
3.查詢效率優(yōu)化方式介紹
表索引介紹,表索引的建立技巧索引優(yōu)點:
第一,通過創(chuàng)建唯一性索引,可以保證數(shù)據(jù)庫表中每一行數(shù)據(jù)的唯一性。第二,可以大大加快數(shù)據(jù)的檢索速度,這也是創(chuàng)建索引的最主要的原因。
第三,可以加速表和表之間的連接,特別是在實現(xiàn)數(shù)據(jù)的參考完整性方面特別有意義。第四,在使用分組和排序子句進行數(shù)據(jù)檢索時,同樣可以顯著減少查詢中分組和排序的時間。
第五,通過使用索引,可以在查詢的過程中,使用優(yōu)化隱藏器,提高系統(tǒng)的性能。(哪給表中的所有列加上索引是否合理)
索引缺點:
第一,創(chuàng)建索引和維護索引要耗費時間,這種時間隨著數(shù)據(jù)量的增加而增加。第二,索引需要占物理空間,除了數(shù)據(jù)表占數(shù)據(jù)空間之外,每一個索引還要占一定的
物理空間,如果要建立聚簇索引,那么需要的空間就會更大。第三,當(dāng)對表中的數(shù)據(jù)進行增加、刪除和修改的時候,索引也要動態(tài)的維護,這樣就
降低了數(shù)據(jù)的維護速度。
(索引是建立在數(shù)據(jù)庫表中的某些列的上面。因此,在創(chuàng)建Oracle數(shù)據(jù)庫索引的時候,應(yīng)該仔細考慮在哪些列上可以創(chuàng)建索引,在哪些列上不能創(chuàng)建索引。)
建議創(chuàng)建索引的列:
在經(jīng)常需要搜索的列上,可以加快搜索的速度;
在作為主鍵的列上,強制該列的唯一性和組織表中數(shù)據(jù)的排列結(jié)構(gòu);
在經(jīng)常用在連接的列上,這些列主要是一些外鍵,可以加快連接的速度;在經(jīng)常需要根據(jù)范圍進行搜索的列上創(chuàng)建索引,因為索引已經(jīng)排序,其指定的范圍是連續(xù)的;
在經(jīng)常需要排序的列上創(chuàng)建索引,因為索引已經(jīng)排序,這樣查詢可以利用索引的排序,加快排序查詢時間;
經(jīng)常使用在WHERE子句中的列上面創(chuàng)建索引,加快條件的判斷速度。
不該創(chuàng)建索引的列:
對于那些在查詢中很少使用或者參考的列不應(yīng)該創(chuàng)建索引。這是因為,既然這些列很少使用到,因此有索引或者無索引,并不能提高查詢速度。相反,由于增加了索
引,反而降低了系統(tǒng)的維護速度和增大了空間需求。對于那些只有很少數(shù)據(jù)值的列也不應(yīng)該增加索引。這是因為,由于這些列的取值很少,例如人事表的性別列,在查詢的結(jié)果中,結(jié)果集的數(shù)據(jù)行占了表中數(shù)據(jù)行的很大比例,即需要在表中搜索的數(shù)據(jù)行的比例很大。增加索引,并不能明顯加快檢索
速度。
對于那些定義為text,image和bit數(shù)據(jù)類型的列不應(yīng)該增加索引。這是因為,這些列的數(shù)據(jù)量要么相當(dāng)大,要么取值很少。第四,當(dāng)修改性能遠遠大于檢索性能時,不應(yīng)該創(chuàng)建索引。這是因為,修改性能和檢索性能是互相矛盾的。當(dāng)增加索引時,會提高檢索性能,但是會降低修改性能。當(dāng)減少索引時,會提高修改性能,降低檢索性能。因此,當(dāng)修改性能遠遠大于檢索性能時,不應(yīng)該創(chuàng)建Oracle數(shù)據(jù)庫索引。
NESTEDLOOP:
對于被連接的數(shù)據(jù)子集較小的情況,嵌套循環(huán)連接是個較好的選擇。在嵌套循環(huán)中,內(nèi)表被外表驅(qū)動,外表返回的每一行都要在內(nèi)表中檢索找到與它匹配的行,因此整個查詢返回的結(jié)果集不能太大(大于1萬不適合),要把返回子集較小表的作為外表(CBO默認外表是驅(qū)動表),而且在內(nèi)表的連接字段上一定要有索引。當(dāng)然也可以用ORDERED提示來改變CBO默認的驅(qū)動表,使用USE_NL(table_name1table_name2)可是強制CBO執(zhí)行嵌套循環(huán)連接。
Nestedloop一般用在連接的表中有索引,并且索引選擇性較好的時候.
步驟:確定一個驅(qū)動表(outertable),另一個表為innertable,驅(qū)動表中的每一行與inner表中的相應(yīng)記錄JOIN。類似一個嵌套的循環(huán)。適用于驅(qū)動表的記錄集比較。
擴展閱讀:Oracle課程小結(jié)1 整本書內(nèi)容
Oracle課程小結(jié)
1.Dual
Dual是Oracle中的一個實際存在的表,任何用戶均可讀取,常用在沒有目標表的Select語句塊中
DUAL就是個一行一列的表,如果你往里執(zhí)行insert、delete、truncate操作,就會導(dǎo)致很多程序出問題
不要去執(zhí)行dropdual的操作,否則會使系統(tǒng)不能用,數(shù)據(jù)庫起不了
DUAL是屬于SYSschema的一個表,然后以PUBLICSYNONYM的方式供其他數(shù)據(jù)庫USER使用
2.Null
在Oracle中,值null被看作一個未知值,任何包含NULL值的算術(shù)運算都會得到結(jié)果NULL,。因此,下面的select語句返回nullselect5+7+null+9fromdual;selectnull*9fromdual;
空字符串:Oracle把空字符串("")當(dāng)作null,因此length("")的值是null,而不是0。
一個null值與任何其它值比較,包括null值,結(jié)果都是null,因此,對NULL的=、!=、>、=、
3.函數(shù)
函數(shù)是一種有零個或多個參數(shù)并且有一個返回值的程序。在SQL中Oracle內(nèi)建了一系列函,也可自定義函數(shù)數(shù)單行函數(shù),多行函數(shù)(組函數(shù))
Lower(c)--小寫轉(zhuǎn)換返回c小寫字符
Concat(c1,c2)--連接字符串
c1,c2均為字符串,函數(shù)將c2連接到c1的后面,如果c1為null,將返回c2.如果c2為null,則返回c1,如果c1、c2都為null,則返回null,如果c1,c2其中之一為數(shù)字,或都為數(shù)字
Concat("10",10)Concat(10,10)
Substr(string,start_position,[length])--取字串參數(shù)1:string要處理的字符串參數(shù)2:截取字符串的開始位置
參數(shù)3:截取的字符串的長度(而不是字符串的結(jié)束位置),如果省略,則返回從start_position開始到string尾之間的字符串SelectSUBSTR("Hello",2)FromDual
Instr(column|expression,"string",[m],[n])--查詢指定字符在字符串中的位置
參數(shù)1:被搜索的字符串或者是表達式參數(shù)2:要查找的字符
參數(shù)3:從什么位置開始查詢
參數(shù)4:這個字符出現(xiàn)的位置比如說:第一次出現(xiàn)的位置,第二次出現(xiàn)的位置。如果此參數(shù)3為正,從左到右開始檢索,如果此參數(shù)為負,從右到左檢索最后兩個參數(shù)是默認的是1和1
SELECTinstr("abc","d")FROMdual;--返回0
SELECTinstr("syranmo","a",1,2)FROMdual;--返回0SELECTINSTR("oWo","W")FROMDUAL;--?
Round(number,[decimalplaces])--四舍五入函數(shù)參數(shù)1:要處理的數(shù)值(數(shù)值表達式)
參數(shù)2:四舍五入時取的小數(shù)的位數(shù),不填則返回整數(shù)selectround(123.456)fromdual;得到123selectround(123.456,0)fromdual;得到123selectround(123.456,1)fromdual;得到123.5selectround(123.456,2)fromdual;得到123.46selectround(123.456,3)fromdual;得到123.456selectround(-123.456,2)fromdual;得到-123.
Mod(number,divisor)--返回一個number除以divisor的余數(shù)參數(shù)1:為被除數(shù)。
參數(shù)2:為除數(shù)。如果divisor為零,函數(shù)MOD返回值為原來number
MOD(3,2)等于1MOD(3,0)等于3MOD(2,3)等于2
To_char(date,"format_model")--日期轉(zhuǎn)為字符To_char(number,"format_model")--數(shù)字轉(zhuǎn)為字符
格式化元素,用于顯示字符形式的數(shù)字值:"9"表示一個數(shù),"."打印一個小數(shù)點","打印一個千位指示
SELECTTO_CHAR(12345.529,"999,999.99")FROMDUAL;--12,345.53
Replace(text,search_string,replacement_string)--替換字符串
從字符串(text)查找一個文本表達式(search_string),如果找到,用指定的置換串(replacement_string)代替它
如果replacement_string為空,那么所有的search_string都被移除。如果search_string為null,那么就返回原來的
SELECTREPLACE("hello","ello","i")FROMDUAL;--hi
To_number([,,])
是將一些處理過的按一定格式編排過的字符串變回數(shù)值型的格式SELECTTO_NUMBER("20")*5FROMDUAL;--100
To_date(string1,[format_mask],[nls_language])--轉(zhuǎn)換為日期Format_mask"yyyy-MM-ddHH24:mi:ss"
selectTo_Date("1981-1-1","YYYY-MM-DD")fromdual--1981-1-1
Length(string)--返回字符串的長度
selectlength("我")fromdual--1selectlength("AB")fromdual-2
4.dbms_output
如果dbms_output.put_line的內(nèi)容不能顯示,需要在命令行中先敲入setserveroutputon;
put和put_line
當(dāng)使用過程put_line時,會自動在行的尾部追加行結(jié)束符;當(dāng)使用過程put時,需要使用過程new_line追加行結(jié)束符.
setserverouton
begin
dbms_output.put_line("偉大的中華民族");
dbms_output.put("中國");
dbms_output.put(",偉大的祖國");
dbms_output.new_line;
end;/
偉大的中華民族
中國,偉大的祖國
new_line
該過程用于在行的尾部追加行結(jié)束符.當(dāng)使用過程PUT時,必須調(diào)用NEW_LINE過程來結(jié)束行.
5.PL/SQL塊DECLARE/*
*定義部分(可選)定義常量、變量、復(fù)雜數(shù)據(jù)類型、游標、例解*/
BEGIN/*
*執(zhí)行部分(必須)PL/SQL語句和SQL語句*/
EXCEPTION/*
*異常處理部分(可選)處理運行錯誤*/
END;/*塊結(jié)束標記*/命名塊:指具有特定名稱標識的PL/SQL塊,在PL/SQL塊前使用加以標記
begin
dbms_output.put_line("Hello,World!");begin
dbms_output.put_line("Good");end;--end;--
賦值操作符“:=”變量名:=值
定義變量
變量名數(shù)據(jù)類型
StudScoreNUMBER(5,2);StudNameVARCHAR(20);
定義常量
添加關(guān)鍵字CONSTANT并賦值
PICONSTANTNUMBER(8,7):=3.1415926;
條件控制
有三種語句形式IF-THEN
IF-THEN-ELSEIF-THEN-ELSIF
IFTHEN語句;ENDIF;
IFTHEN語句;ELSE語句;ENDIF;
IFTHEN語句;
ELSIFTHEN語句;
ELSIFTHEN語句;ELSE語句;ENDIF;
CASE
WHENTHEN語句;
WHENTHEN語句;
WHENTHEN語句;[Else]語句;EndCase;
CASE
WHENTHEN語句;
WHENTHEN語句;
WHENTHEN語句;[Else]語句;
EndCase;
有三種形式的LOOP語句LOOP
WHILE-LOOPFOR-LOOP
LOOP語句;
[EXIT]
[EXIT-WHEN]ENDLOOP;
EXIT強制循環(huán)無條件完成立即退出循環(huán)
EXITWHEN;EXIT語句時對WHEN子句中的條件進行判斷如果判定條件為TRUE,則循環(huán)完成
WHILELOOP
語句;ENDLOOP;
FORIN[Reverse]lower_bound..higher_boundLOOP語句;ENDLOOP;
6.子程序過程
用于執(zhí)行某項操作函數(shù)
用于執(zhí)行某項操作并返回值
存儲過程語法
CREATE[ORREPLACE]PROCEDURE[(參數(shù)1,參數(shù)N)]IS|AS[局部聲明]BEGIN
可執(zhí)行語句;EXCEPTION
[例外處理程序];END[];參數(shù)說明
變量名[IN|OUT|INOUT]
IN:輸入,接受值,默認模式
OUT:輸出,將值返回給子程序的調(diào)用程序INOUT:輸入輸出,接受值并返回已更新的值對于IN模式的實參可以是常量或變量,但對于OUT和INOUT模式的實參必須是變量。
CreateOrReplaceProcedureProcGetName(StudNameinoutvarchar2)isBegin
StudName:=substr(StudName,instr(StudName,"明",2));End;/
declare
StudNamevarchar2(15):="明小明";begin
ProcGetName(StudName);
DBMS_OUTPUT.PUT_LINE(StudName);end;函數(shù)語法
CREATE[ORREPLACE]FUNCTION[(參數(shù)1,參數(shù)N)]RETURNdatatypeIS[局部聲明]BEGIN可執(zhí)行語句;[EXCEPTION][例外處理程序]END[];
僅接受IN參數(shù)
CreateOrReplaceFunctionGetItemScore(Stand_Ansvarchar2,Custor_Ansvarchar2)returnintis
LenCustorint:=length(Custor_Ans);begin
ifLenCustor>length(stand_ans)orCustor_AnsISNULLthenreturn0;endif;
foriin1..LenCustorloop
ifinstr(stand_ans,substr(custor_ans,i,1))=0thenreturn0;endif;endloop;
returnLenCustor;end;/
SelectGetItemScore("ABC","AC")FromDual;
7.OracleSQL*Plus命令
setlinesize設(shè)置每行顯示的長度SETLINESIZE100
start或@告訴SQLPLUS執(zhí)行已經(jīng)存儲到sql文件中語句
執(zhí)行一個SQL腳本文件SQL>startfile_nameSQL>@file_name
我們可以將多條sql語句保存在一個文本文件中,這樣當(dāng)要執(zhí)行這個文件中的所有的sql語句時,用上面的任一命令即可
修改用戶密碼
ALTERUSER用戶名IDENTIFIEDBY密碼;
oracle中邏輯運算符(not,and,or)及其優(yōu)先級
這3種邏輯運算符中,NOT運算符的優(yōu)先級最高,而后是AND,最后是OR
Oracle中的SPOOL命令是假脫機命令,可用于轉(zhuǎn)儲執(zhí)行的命令和結(jié)果,其效果有點像DOS命令中的轉(zhuǎn)向命令。SPOOL命令也可以用于轉(zhuǎn)出數(shù)據(jù)庫系統(tǒng)中的數(shù)據(jù)。
例如在SQL*Plus命令行中可以直接輸入:SPOOL假脫機文件名啟動假脫機操作。
關(guān)閉假脫機操作可以在SQL*Plus中輸入:SPOOLOFF例:假脫機命令的使用。spoolc:\\SpoolFile.txtsetpagesize300setlinesize300select*fromemp;select*fromdept;spooloff;
執(zhí)行完畢后,可以在C盤中找到SpoolFile.txt,打開后可以看到通過Spool假脫機命令轉(zhuǎn)向到該文件中的內(nèi)容。
8.記錄類型
定義一個RECORD類型TYPEISRECORD(
fieldname1[NOTNULL]:
fieldnameN[NOTNULL]);
屬性的類型
%TYPE引用數(shù)據(jù)庫列
%ROWTYPE代表表中的行
%type和%rowtype可以用來指定列的數(shù)據(jù)類型
SNameStudInfo.StudName%Type;Stud_RecStudInfo%ROWTYPE;
TypeVIPStudRecisrecord(
VIPIDVarchar2(15),VIPNamevarchar2(20));
聲明記錄類型變量
StudRecVIPStudRec;
引用字段的語法是
recordname.columnname用于給列賦值的語法是
recordname.columnname:=expression;
語法
SELECTINTOFROMWHERE;
SELECTStudNo,StudNameINTOStudRecFROMStudInfoWHEREStudNo=‘99070470’;fetchmycurintoStudRec;
TIDTeacherInfo.TeacherNo%Type;TNameTeacherInfo.TeacherName%type;
9.游標
CURSORIS;
CURSORmycuris
selectTeacherNo,TeacherNameFromTeacherInfo
WhereTeacherBirthDay>=To_Date("1981-2-5","YYYY-MM-DD");控制顯式游標OPENFETCHCLOSE
在使用OPEN、CLOSE或FETCH語句引用這些語句之前必須對游標進行聲明
OPENopenmycur;
FETCHINTOvar1,…,varN;OR
FETCHINTOrecord_variable;fetchmycurintoTID,TName;
每個游標有四個屬性可以用于訪問游標的環(huán)境區(qū)域%NOTFOUND%FOUND%ROWCOUNT%ISOPEN
循環(huán)取記錄
whilemycur%foundloopdbms_output.put_line(TID||TNAME);fetchmycurintoTID,TName;endloop;
CLOSE;
closemycur;
10.表
CREATETABLE[schema.]table
(columndatatype[DEFAULTexpr][,...]);指定:表名
列名、列數(shù)據(jù)類型和列的大小
數(shù)據(jù)類型
VARCHAR2(size)可變長度的字符數(shù)據(jù)長度可以到4000字節(jié)CHAR(size)固定長度的字符數(shù)據(jù)NUMBER(p,s)可變長度的數(shù)字數(shù)據(jù)DATE日期和時間值NCHAR、NVARCHAR2,國家字符集,與環(huán)境變量NLS指定的語言集密切相關(guān),使用方法和CHAR、VARCHAR2相同。
在創(chuàng)建表時,為一個列指定一個默認值createtablec(c1char(10)DEFAULT"1111")
altertabletestaddsyddatedefaultsysdate;
altertabletmodify(cccdefault"ccc");altertabletmodify(cccdefaultnull);
INSERTINTOdepartments
(department_id,department_name,manager_id)VALUES(300,"Engineering",DEFAULT);
UPDATEdepartments
SETmanager_id=DEFAULTWHEREdepartment_id=10;
約束類型NOTNULLUNIQUE
PRIMARYKEYFOREIGNKEYCHECK
列級約束
column[CONSTRAINTconstraint_name]constraint_type,表級約束column,...
[CONSTRAINTconstraint_name]constraint_type(column,...),
NOTNULL約束
只能定義在列級,不能定義在表級.
防止NULL值進入指定的列,在單列基礎(chǔ)上定義,默認情況下,ORACLE允許在任何列中有NULL值
CREATETABLEemployees(
employee_idNUMBER(6),
last_nameVARCHAR2(25)NOTNULL,salaryNUMBER(8,2),commission_pctNUMBER(2,2),hire_dateDATE
CONSTRAINTemp_hire_date_nnNOTNULL,...
UNIQUE約束
用來保護一個表中的一個或者多個列沒有任何兩行在收到保護的列中具有重復(fù)的數(shù)據(jù).ORACLE在唯一鍵列上自動生成一個唯一索引以實現(xiàn)唯一性
CREATETABLEemployees(
employee_idNUMBER(6)unique,
last_nameVARCHAR2(25)NOTNULL,emailVARCHAR2(25),salaryNUMBER(8,2),commission_pctNUMBER(2,2),hire_dateDATENOTNULL,...
CONSTRAINTemp_email_ukUNIQUE(email));
PRIMARYKEY約束
唯一鍵的所有特征都適用于主鍵約束,只是在主鍵列中不允許有NULL值CREATETABLEdepartments(
department_idNUMBER(4),emailVARCHAR2(25),location_idNUMBER(4),CONSTRAINTdept_id_pkPRIMARYKEY(department_id));
FOREIGNKEY約束
通過使用公共列在表之間建立一種父子(parent-child)關(guān)系,在表上定義的外部鍵可以指向主鍵或者其他表的唯一鍵.
CREATETABLEemployees(
employee_idNUMBER(6),...
department_idNUMBER(4),
CONSTRAINTemp_dept_fkFOREIGNKEY(department_id)REFERENCESdepartments(department_id),
CHECK約束
檢查在約束中指定的條件是否得到了滿足.
createtableemployees(salnumber(7,2)
constraintemp_sal_ck1check(sal>0))
createtabley(
idvarchar2(7)
check(ascii(substr(id,1,1))between65and90andsubstr(id,1,1)isnotnullandascii(substr(id,2,1))between65and90andsubstr(id,2,1)isnotnullandascii(substr(id,3,1))between65and90andsubstr(id,3,1)isnotnullandascii(substr(id,4,1))between65and90andsubstr(id,4,1)isnotnullandascii(substr(id,5,1))between65and90andsubstr(id,5,1)isnotnull));
CREATETABLETT(
department_idNUMBER(4)check(department_idlike"trj%"),emailVARCHAR2(25)PRIMARYKEY);
CREATETABLETT(
department_idNUMBER(4),
emailVARCHAR2(25)PRIMARYKEY,
STUDSEXVARCHAR2(2)CHECK(STUDSEXIN("男","女")));
添加一個新行到表中INSERTINTOtable[(column[,column...])]VALUES(value[,value...]);
INSERTINTOdepartmentsVALUES(100,"Finance",NULL,NULL,SYSDATE,TO_DATE("FEB3,1999","MONDD,YYYY");
改變表中的數(shù)據(jù)UPDATEtableSETcolumn=value[,column=value,...][WHEREcondition];
UPDATEcopy_emp
SETdepartment_id=110
WHEREdepartment_name="HELLO";
從表中刪除行
DELETE[FROM]table[WHEREcondition];
DELETEFROMdepartments
WHEREdepartment_name="Finance";
11.視圖
視圖是一個SQL查詢,它永久存在于數(shù)據(jù)庫中,并被賦予了一個名稱,視圖是從基表中生成的虛擬表
CREATE[ORREPLACE][FORCE|NOFORCE]VIEWview[(alias[,alias]...)]ASsubquery
[WITHCHECKOPTION[CONSTRAINTconstraint]][WITHREADONLY[CONSTRAINTconstraint]];
withcheckoption:表名只有子查詢檢索的行才能被插入、刪除、更新withreadonly:說明只能對基表中的行進行只讀訪問
onstraint_name:指定withcheckoption或readonly約束的名稱。
CREATEVIEWsalvu50
ASSELECTemployee_idID_NUMBER,last_nameNAME,salary*12ANN_SALARYFROMemployees
WHEREdepartment_id=50;
SELECT*FROMsalvu50;
內(nèi)建視圖是一個帶有別名(或相關(guān)名)的可以在SQL語句中使用的子查詢
Top-N分析
SELECTROWNUMasRANK,last_name,salaryFROM(SELECTlast_name,salaryFROMemployeesORDERBYsalaryDESC)AWHEREROWNUMWHEREexproperator(SELECTselect_listFROMtable);
查詢的結(jié)果進行排序處理。排序處理是通過ORDERBY子句來實現(xiàn)的。ORDERBYorder_list[ASC|DESC]
13.組函數(shù)AVGCOUNTMAXMINSUM
SELECT[column,]group_function(column),...FROMtable
[WHEREcondition][GROUPBYcolumn][ORDERBYcolumn];
SELECTAVG(salary),MAX(salary),MIN(salary),SUM(salary)FROMemployees
WHEREjob_idLIKE"%REP%";
SELECTCOUNT(*)FROMemployees
WHEREdepartment_id=50;
SELECTCOUNT(DISTINCTdepartment_id)FROMemployees;
約束分組結(jié)果:HAVING子句GROUPBY子句
SELECTdepartment_id,AVG(salary)FROMemployees
WHEREAVG(salary)>8000GROUPBYdepartment_id;
14.綜合知識
1.學(xué)生信息表(StudInfo)數(shù)據(jù)類字段是否P字段名稱約束型長度為空KStudNoVarchar215Y字段描述舉例StudNameVarchar220StudSexChar2男,女StudBirthDDateYayClassNameVarchar250班級名稱計本012.課程信息表(CourseInfo)字段是否字段名稱數(shù)據(jù)類型PK字段描述舉例長度為空CourseIDVarchar210Y課程編號A0101CourseNamVarchar2eCourseDescVarchar250100Y課程名稱Oracle課程描述OracleDB學(xué)生學(xué)號201*070470學(xué)生姓名李明學(xué)生性別男出生年月1980-10-33.學(xué)生成績表(StudScoreInfo)字段名數(shù)據(jù)類字段是否PK約束稱型長度為空StudNoVarchar215Y字段描述舉例CourseIDVarchar210YStudScorNumber4,1[0,100e]注:一個學(xué)生可選修多門課,同一門課可由多個學(xué)生選修。
學(xué)生學(xué)號201*070470課程編號A0101學(xué)生成績80.51.分別寫出向以上各表插入一條記錄的SQL語句。(記錄為舉例中的數(shù)據(jù))2.寫出更新學(xué)生成績表(StudScoreInfo)中學(xué)號為201*070470,課程編號為A0101的成績?yōu)?5.5的SQL語句。
3.寫出在課程信息表(CourseInfo)中刪除課程編號為B0101的SQL語句。4.寫出查詢姓李的學(xué)生基本信息的SQL語句。
5.在學(xué)生成績表(StudScoreInfo)中,寫出將課程編號為A0101成績從高到低排序的SQL語句。
6.寫出在學(xué)生成績表(StudScoreInfo)中查詢學(xué)生成績大于等于90小于等于100或者大于等于70小于等于80的SQL語句。7.在學(xué)生成績表(StudScoreInfo)中,寫出統(tǒng)計各學(xué)生總分、平均分、課程門數(shù)、最高分、最低分的SQL語句。
8.寫出統(tǒng)計學(xué)生平均分大于80的SQL語句。
9.寫出查詢平均分最高的5個學(xué)生成績統(tǒng)計信息(包括學(xué)號、平均分字段)中的SQL語句。10.寫出查詢重修(學(xué)生成績小于60即為重修)15門以上的學(xué)生基本信息的SQL語句。11.綜合利用所學(xué)知識,用SQL語句實現(xiàn)將各學(xué)生平均分(需統(tǒng)計)按以下等級輸出,包括學(xué)生學(xué)號(StudNo)、平均分(PScore)、成績等級(ScoreLevel)字段。
平均分(PScore)成績等級(ScoreLevel)PScore>=90
優(yōu)秀
良好中等及格
80= 友情提示:本文中關(guān)于《我個人關(guān)于ORACLE課程提綱的總結(jié)》給出的范例僅供您參考拓展思維使用,我個人關(guān)于ORACLE課程提綱的總結(jié):該篇文章建議您自主創(chuàng)作。 來源:網(wǎng)絡(luò)整理 免責(zé)聲明:本文僅限學(xué)習(xí)分享,如產(chǎn)生版權(quán)問題,請聯(lián)系我們及時刪除。
《我個人關(guān)于ORACLE課程提綱的總結(jié)》由互聯(lián)網(wǎng)用戶整理提供,轉(zhuǎn)載分享請保留原作者信息,謝謝!
鏈接地址:http://www.hmlawpc.com/gongwen/712076.html