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