Oracle經(jīng)典自學筆記_第1頁
Oracle經(jīng)典自學筆記_第2頁
Oracle經(jīng)典自學筆記_第3頁
Oracle經(jīng)典自學筆記_第4頁
Oracle經(jīng)典自學筆記_第5頁
已閱讀5頁,還剩25頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、一驗證Oraclle已經(jīng)安裝裝完成了,首首先得確認程程序里有這些些個選項,有有四個選項:Oraclle Insstallaation Produucts、集集成管理工具具、配置和移植工工具(管理員員用得比較多多)、應用程程序開發(fā)。Oraclle也可以形形成一種層次次性的鏈接(DDirecttory MManageer),對于我們來來說用得最多多是sqlpplus,而而OLE 是是一種面向對對象的技術,利利用這種技術術可開發(fā)可重重復使用的軟軟件組件(CCOM),他他是微軟提出出的,在用VVB開發(fā)時可可能要用,對對于我們來說說不須管。當啟動sqllplus時時會提示輸入入用戶名和口口令,所謂的的s

2、qlpllus是Orracle的的一個客戶端端。Oraccle大多數(shù)數(shù)命令都用命命令來實現(xiàn),所所以比較難使使,就如同uunix比wwindowws難使??诳诹钅爿斎雝tiger,建建議就用它,因因為以后去企企業(yè)里Oraacle 99i就是用的的這個口令。當你看到SSQL命令令符時說明已已經(jīng)進入到了了Oraclle的命令行行了。圖形版的sqllplus,命命令行的sqqlpluss,還有一個個就是通過網(wǎng)網(wǎng)頁訪問Orracle的的服務,啟動動sqlpllus,端口口號是55660,URLL是 HYPERLINK httpp:/1227.0.00.1:55560/issqlpluus。isqqlpl

3、uss httpp:/1227.0.00.1:55560/issqlpluus。isqqlpluss非常有用,比比如說你的機機器上沒有裝裝上Oraccle,就可可以通過鍵入入別人的IPP,然后登陸陸到他的機器器上來做實驗驗,當然也可可以安裝特定定的客戶端軟軟件實現(xiàn)。說實在的Oraacle的這這個客戶端太太難看了,并并且要記好多多好多的命令令,所以專門門有一類公司司專門為Orracle開開發(fā)客戶端。有一個比較較著名的客戶戶端叫Toad,當當然Oraccle還有一一個客戶端PPL/SQLL Deveelplorr,這個用的的也非常多。數(shù)據(jù)庫管理理時常用Tooad(英文文蛤蟆的意思思),如果有有聲卡

4、的話,你你啟動一次它它就叫一次。對我們來說說sqlpllus足夠使使了。以后有有機會我使用用一下PL/SQL DDevelpplor,不不過這個也不不好使,因為為你同時必須須裝上Oraacle,還還不如isqqlpluss好呢。以超級管理員身身份鏈接數(shù)據(jù)據(jù)庫的方法是是再命令行下下敲入命令:sqlpllus syys/口令 as syysdba。Sys和syystem的的區(qū)別是syys是數(shù)據(jù)庫庫管理者,ssystemm是數(shù)據(jù)庫所所有者,sys用戶擁擁有dba,sysdbba,sysopper等角色色或權限,是是oraclle權限最高高的用戶,ssystemm用戶擁有dbba,sysdbba等角色

5、或或系統(tǒng)權限,system如果正常登錄,它其實就是一個普通的dba用戶,但是如果以as sysdba登錄,其結果實際上它是作為sys用戶登錄的,這一點類似Linux里面的sudo的感覺,從登錄信息里面我們可以看出來。sys用戶必須以as sysdba或as sysoper形式登錄。然后輸入命令alter user scott account unlock;它的意思是將Scott用戶解鎖,以后關于dba的用到一個學一個,沒必要從頭到尾的去學它。二SQL語言是在在數(shù)據(jù)庫下進進行操作的語語言,它本身身是一個標準準語言,有國國際標準。有有兩套一個是是SQL19992,SQQL19999。大多數(shù)數(shù)數(shù)據(jù)庫

6、既支持持舊的標準也也支持新的,很很多也是用的的舊的SQLL語言寫程序序的,對于我我們來說新舊舊都要學,而而且對大多數(shù)數(shù)數(shù)據(jù)庫系統(tǒng)統(tǒng)來說都是通通用的,只不不過不同數(shù)據(jù)據(jù)庫有一個輕輕微的改變,這這就是最郁悶悶的地方,沒沒辦法到時候候查手冊或ggooglee一下。SQL全稱稱為Struuctureed Queery Laanguagge,即機構化查查詢語言,它被定義為為第四代語言言。為什么叫叫第四代語言言,因為我們們知道第三代代語言也得有有if ellse foor 等這些些流程控制語語句,也就是是你得告訴它它干什么且怎怎么干。第四四大只用告訴訴它我要干什什么,不用去去控制它怎么么干,這樣的的語言學

7、起來來當然十分eeasy。我們共有四類類語句要學:數(shù)據(jù)操作語語言語句Data manippulatiion laanguagge,DMLL,會話控制語語句 HYPERLINK /searchwhatis/18/.shtml sessiion coontroll stattementt,數(shù)據(jù)定義語語言語句DData ddefiniition languuage,DDDL以及及事務控制語語句 HYPERLINK /searchwhatis/297/.shtml transsactioon conntrol stateement。查詢語句只有一一句話就是sselectt語句,這是是最重要的一一條語句

8、。以以后只要遇到到相應的seelect語語句一律背過過,企業(yè)再面面試時其他語語句一般不會會怎么考但這這條語句是必必考的。如果果考你SQLL語句肯定會會考這條seelect語語句不是別的的。你跟別人人交流的時候候,別說我寫寫過幾條dmml語句,而而因詳細的說說到底是什么么語句,比如如inserrt語句、uupdatee語句等。選擇的意思思是從表里把把數(shù)據(jù)拿出來來,展現(xiàn)出來來。聽起來似似乎挺簡單的的,但你要從從表里拿數(shù)據(jù)據(jù)得首先知道道有幾張表,每每張表里有些些什么內容。第一步要做的的就是熟悉一一下實驗用的的數(shù)據(jù),這些些數(shù)據(jù)Oraacle都給給自帶了,直直接用就行了了。首先第一一條語句deesc e

9、mmp,描述一一下emp這這張表,會分分別列出所有有字段(表頭頭),emppno 雇員員編號,enname 雇雇員名字,jjob 雇員員工種,mggr 經(jīng)理人人,hireedate 雇員入職日日期,sall 薪水,ccomm 津津貼,獎金,ddeptnoo 所屬部門門編號。表還有一部部分叫類型,也也就是相對應應字段的類型型,這些都是是Oraclle已經(jīng)定義義好的,我們們直接用?,F(xiàn)現(xiàn)在先用別人人建立好的表表,然后再自自己建表。NNUMBERR指數(shù)字,VVARCHAAR指字符型型,Oraccle7以前前在用,現(xiàn)在在常用的是VVARCHAAR2它支持持各種可變字符串,可以更好的的表示各國文文字,DA

10、TTE指日期,NNUMBERR(7,2)指七位數(shù)字字有兩位小數(shù)數(shù)。desc deept 部門門表,它有三三個字段DEEPTNO 部門編號,DDNAME 部門名稱,LLOC部門所所在位置。DDesc ssalgraade工資等等級表,許多多公司都實行行的是工資等等級制,分幾幾級工資,GGRADE工工資等級,HHISAL該該等級最高工工資,LOSSAL該等級級最低工資。以上簡要的介紹紹了三張表,如如果想更詳細細的了解里面面的數(shù)據(jù),教教大家第一個個selecct語句:seclectt *frrom 表名名;。*表示把表表里所有的數(shù)數(shù)據(jù)都取出來來,分號表示示語句結束。盡量多熟悉悉各張表之間間的關系,以

11、以及表內部各各字段之間的的關系,越熟熟悉越好。如果要算純數(shù)據(jù)據(jù),可以采用用dual這這張表,它就就一條記錄,一一個字段。你你如果用其他他表計算的話話會有好多條條重復結果,記記錄。字段是不能有空空格的,如果果非要空格可可以將整個字字段用雙引號號括起來,這這樣的話引號號里面就可以以加上各種各各樣的字符了了。如果沒加加引號的話那那樣做是不對對的。再沒有有加雙引號的的時候結果字字段名會以大大寫字母顯示示出來,但加加了雙引號就就保持住了原原來的形式不不變。沒有就就是nulll值,即便是是0也與空值值大不一樣。0是有值但但為0,nuull是沒有有值。任何含含有空值的表表達式最后的的結果都是空空值。SQL里

12、面有一一個字符串鏈鏈接符|,它它的作用跟JJava里的的+一樣,所所有被鏈接的的都會轉換為為字符串顯示示出來。如selecct enaame|ssal frrom emmp;它的意意思是將結果果sal轉換換為字符串后后鏈接到enname后面面。在任何數(shù)據(jù)據(jù)庫的SQLL語句里面都都是用單引號號括起來表示示一個字符串串序列。如果果字符串里本本來就有單引引號,再解析析時就會出錯錯??梢杂脙蓛蓚€單引號來來代替一個單單引號,這樣樣就可以正確確顯示了。關鍵字disttinct是是指選擇不重重復的記錄,如如果修飾多個個字段時表示示選擇該多個個字段的組合合不重復的顯顯示出來。wwhere叫叫過濾條件,它它會過

13、濾掉一一些記錄,等等值判斷用=,不等值判判斷注意是而不是JJava語句句里的不等號號。字符串比較較是比較字符符的ASCIII碼,挨個個比較。做比比較時還可以以用關鍵字bbetweeen andd,注意的是是包括邊界值值的。andd也可把兩個個過濾條件連連接起來。下面來講空值值的處理,你你可以直接用用wheree +字段+is nuull來取出出是空值的,取取出不是空值值的多加一個個not就行行。這種處理理方式非常像像我們的說話話習慣。inn然后跟著某某個字段的取取值是括號括括起來各值之之間用逗號隔隔開??梢允故褂胊nd、or,noot連接起各各個查詢條件件。日期處理起來稍稍微麻煩一些些,由于現(xiàn)

14、在在還沒有學日日期函數(shù),所所以采用另外外一種方式一個特殊的的字符串。你你就按它的日日期寫法來寫寫如20-2月月-07,然后系統(tǒng)統(tǒng)就按照字符符串來比較即即可。年份可可以寫全如20-2月月-2007,它能認出出來。以后我我們可以寫成成任何形式的的日期格式都都能處理。模糊查詢是這樣樣的,比如找找出名字里含含有al的,有有點像正則表表達式。使用用關鍵字liike,可以以通配符%,代代表0個或多多個字符,_代表一個字字母。如果名字里里就含有一個個%,則使用用轉義字符%的形式,當當然可以自己己指定轉義字字符方法是sselectt * frrom emmp wheere enname llike _A$%

15、esccape $;。排序用到的一個個關鍵字是oorder by,默認認的是按升序序排列,如果果想降序排列列可以采用如如下形式:sselectt * frrom deept orrder bby depptno ddesc;ddesc是降降序的英文縮縮寫。升序排排列可不寫也也可加上assc。還可以以加入wheere先過濾濾了再排序,按照幾個字段進行排序時,用逗號分隔開,如下:select ename ,job,empno,sal ,deptno from emp order by deptno,sal desc;意思是先將表按照deptno升序排列,然后相同的deptno內部再按照sal降序排

16、列。三SQL函數(shù),函函數(shù)就是Jaava里的方方法,有參數(shù)數(shù)有返回值?,F(xiàn)在講的是是單行函數(shù),第第一個叫做llower,作作用是轉換為為小寫;第二二個叫uppper,作用用是轉為大寫寫;第三個叫叫substtring,取取子串。這幾幾個函數(shù)都是是對字符串進進行操作的,傳傳遞進去的參參數(shù)就是字段段名。如selecct lowwer(enname) from emp;還還有一個函數(shù)數(shù)叫chr,它它是把一個數(shù)數(shù)字轉為字符符:seleect chhr(86) fromm duall;將86代代表的字符顯顯示出來,與與之對應的是是將一個字符符轉為對應的的ASCIII碼,叫asscii,如如:seleect

17、asscii(A) froom duaal;就是將將A的碼值顯顯示出來。round函數(shù)數(shù)是四舍五入入的作用,如如selecct rouund(433.) frrom duual;結果果就為44。還有一個重重載的帶兩個個參數(shù)的方法法如seleect roound(443.,4) fromm duall;四舍五入入到小數(shù)點后后4位,結果果位44.55354,第第二個參數(shù)可可以是負數(shù)表表示四舍五入入到小數(shù)點前前多少位。其他函數(shù)可以不不用記住,但但要知道有這這么個函數(shù),然然后取手冊中中可以查到,但但下面講的一一個函數(shù)最好好記住它。tto_chaar是將字段段內容顯示為為字符,可以以對顯示的形形式進行格

18、式式控制,比如如selecct to_char(sal, $99,999,9999.99999) from emp;就就是以后面給給定字符形式式顯示出來,小小數(shù)點后的四四位會強制顯顯示,而前面面的沒有的位位數(shù)就不顯示示,這就是99的含義。$換為L表示示本地貨幣。0代表一位位數(shù)字,如果果沒有該位數(shù)數(shù)字也會強制制顯示為0,對于這種方式是為了進行格式控制。實際上用too_charr來控制數(shù)字字是比較少用用的,而用得得最多的是對對日期格式的的控制,我們們知道Oraacle里的的sysdaate包含了了插入記錄的的詳細時間信信息,我們可可以對其進行行顯示的格式式進行控制,比比如:sellect tto_

19、chaar(hirredatee,yyyyy-mm-dd) from emp;轉轉換為年月日日2006-3-23這這種格式的。實際上對日日期的格式控控制是利用JJava來實實現(xiàn)的,到時時會有一個關關于日期處理理的專題。select enamee,job,hireddate ffrom eemp whhere hhiredaate tto_datte(19982-1-1 1:330:00, yyyyy-mmm-dd hhh:mi:ss);意思是將特特定的字符串串轉換為相應應的日期格式式。還有to_numbeer是將特定定的字符串解析為為相應的數(shù)字格格式如selecct enaame ,jjob

20、,ssal frrom emmp wheere saal22000;首首先按depptno求出出每個depptno的平平均sal,然然后對這些分分組利用haaving 語句進行過過濾。到現(xiàn)在為止已已經(jīng)學完了所所有的單條sselectt語句,執(zhí)行行順序按照sselectt+字段或內容+frrom+表名名+wherre+grouup by+haviing+ordeer by這個順序進進行執(zhí)行,首首先取出記錄錄,然后對單單個記錄進行行過濾,過濾濾完了分組,分分組好了對組組過濾,剩下下的分組再按按順序顯示出出來。單條sselectt語句一定要要非常熟悉,如如果這都要查查書的話對企企業(yè)就沒法交交代了,哈

21、哈哈!之前已經(jīng)講過一一個子查詢的的例子:seelect enamee,sal from emp wwhere sal=(selecct maxx(sal) fromm emp);看誰的工工資最高,之之所以叫子查查詢因為再一一個seleect語句里里套了另外一一個seleect語句。理解子查詢詢的關鍵是把把它當成一張張表,可以對對它做表連接接最后就可以以求出想要的的結果來。單單獨的sellect語句句相當簡單,但但是有了seelect子子句和表連接接之后語句就就稍微復雜了了點。sellect eename ,sal from emp jjoin(sselectt max(sal) max_ssa

22、l,deeptno from emp ggroup by deeptno) t onn (empp.sal=t.maxx_sal and tt.depttno=emmp.depptno);這個語句的的作用是求出出每個部門薪薪水最高的員員工記錄。select e1.enname,ee2.enaame frrom emmp e1,emp ee2 wheere e11.mgr=e2.emmpno;對對于在同一張張表中進行查查詢時需要進進行自連接,為為表取別名便便于寫出條件件和比較。這這條語句的意意思是找出每每個員工的經(jīng)經(jīng)理人。為同同一張表起不不同的別名然然后當成兩張張表來用。在SQL99里里面鏈接條

23、件件和過濾條件件是分開的,即即鏈接條件不能能出現(xiàn)在whhere語句句里面,利用用Join+表名+onn+鏈接條件件進行。比如如:seleect enname ,job,ddname from emp jjoin ddept oon (emmp.depptno=ddept.ddeptnoo);等值鏈鏈接的時候有有一個簡便的的寫法usiing(deeptno)代替on (emp.deptnno=deppt.depptno)但但不推薦使用用,因它的限限制條件很多多,可能報出出來的錯誤很很難找并且看看起來也不是是很清楚。連接有各種各樣樣的形式,下下面我們講外外連接,其實實用起來特別別方便。它會把左邊邊

24、那張表不能能和右邊鏈接接的數(shù)據(jù)也拿拿出來。seelect t1.enname , t2.eename mgr , t1.ddeptnoo fromm emp t1 left ouuter jjoin eemp t22 on (t1.mggr=t2.empnoo);outter可以省省略掉效果一一樣。如果想想把右邊多余余的拿出來JJoin前加加上righht即可;如如果兩邊多余余的都想拿出出來Joinn前加上fuull叫全外外連接。講一道面試題,不不準用組函數(shù)數(shù)求出薪水的最最高值。方法法是用自連接接,連接條件件采用非等值值連接,這這樣表中的最最大值就會連連接不上,然然后再從emmp表中找出出未連

25、接上的的最大值,如如下:sellect ssal frrom emmpwherre sall not in (sselectt t1.ssal frrom emmp t1jjoin eemp t22on (tt1.sall(sselectt max(sal) from emp wwhere empnoo not in (sselectt disttinct mgr ffrom eemp whhere mmgr iss not null) andd empnno in (seleect diistincct mgrr fromm emp wheree mgr is noot nulll );再講

26、一道面試題題:比較這兩兩個語句的執(zhí)執(zhí)行效率Select * froom empp wherre depptno=110 andd enamme likke %A%;Select * froom empp wherre enaame liike %A%anddepptno=110;理論上說應該是是第一個,就就如同&和和&的區(qū)別一一樣它會過濾濾掉很多條件件,后面的字字符串就不用用再取去比較較了,但實際際中不好說因因為有可能OOraclee在執(zhí)行的時時候做了優(yōu)化化,自動將數(shù)數(shù)字比較放前前面了。四現(xiàn)在已經(jīng)講完完了seleect語句,接接下來講dmml語句,常常見的有三條條,他們和sselectt語句合

27、稱為為數(shù)據(jù)庫的四四大語句(sselectt/inseert/uppdate/delette)。增刪改查!接下來簡單介紹紹一下Oraacle的邏邏輯結構。安安裝的時候創(chuàng)創(chuàng)建了一個全全局數(shù)據(jù)庫,同同時為這個數(shù)數(shù)據(jù)庫建立了了一系列管理理它的進程SSID。一個大數(shù)據(jù)據(jù)庫里面又區(qū)區(qū)分為不同的表空空間,說白了了就是裝表的的地兒。我們們現(xiàn)在的表是是放在不同的的表空間里面面,比方說uusers表表空間,在里里面放著某個個用戶所有的的表,當該用用戶登錄進去去后其實是去去訪問自己的的表空間里的的相對應的表表??梢詫⒛衬硞€表空間里里的內容全部部copy出出去創(chuàng)建一個個新的useer,然后該該user就就操作專屬于于

28、自己的表空空間里的表了了,所以說OOraclee是支持多用用戶的。將某個表空間里里的內容全部部copy出出去創(chuàng)建一個個新的useer做法是這這樣的:1.以超級管理理員登錄數(shù)據(jù)據(jù)庫connn sys/oraclle as sysdbba;2.從命令行行在起一個cclientt,先建立一一個目錄如CC:tesst進入該目目錄后執(zhí)行ddel *.*刪除所有有,然后鍵入入命令expp后提示輸入入用戶名和口口令,就是你你要備份哪個個就輸哪個,接接下來提示輸輸入數(shù)組提取取緩沖區(qū)大小小,這個沒關關系(內存里里的一個小區(qū)區(qū)域填滿了再再統(tǒng)一拿到硬硬盤上來)一一路回車就行行,等著它導導完就可以了了;3.創(chuàng)建新用用

29、戶creaate usser huuanggaang iddentiffied bby hahha08322 defaault ttablesspace userss quotta 10MM on uusers;用戶名huuanggaang口令hhaha08832在ussers表空空間里分配110M的默認認表空間給該該用戶;4.給予相應應權限graant crreate sessiion,crreate tablee,creaate viiew too huannggangg,如果沒有有sessiion它登錄錄都是問題;5.導入文文件imp后后回車幾個后后提示是否導導入整個導出出文件選否后后輸

30、入想導入入的那個用戶戶數(shù)據(jù)的用戶戶名。只有2和55是在命令行行中完成,其其余是超級用用戶登錄后在在數(shù)據(jù)庫里完完成。insert into+表名+vaalues(各各字段值),在在對這些數(shù)據(jù)據(jù)進行操作時時最好有一個個備份,方法法很簡單roollbacck回退操作作,creaate taable 表表名 as selecct * ffrom +欲備份表名名;inserrt語句還有有一種插入方方法,inssert iinto ddept2(deptnno,locc) vallues(550,beeijingg);只是是插入部分字字段的值,其其他字段的值值為nulll,還有一種種方法是innsert

31、into dept22 seleect * from dept;將seleect子句選選出的記錄挨挨個插入前提提是選出的記記錄與該表的的記錄格式相相同。在Oraclee中取完相應應字段后,會會在末尾附加加一個偽字段段,你看不到到,叫做roownum,它它是記錄下每每條記錄在第第幾行了,用用它的時候有有個限制條件件只能與或或=6 aand r=10;這個在Oraccle里面是是效率最高的的,如果通過過連接數(shù)據(jù)庫庫用Javaa編程來做,但但效率相當?shù)偷?。這個重點點掌握,比如如說顯示論壇壇里的帖子是是分頁顯示的的,如果想顯顯示第4頁的的內容一定是是從某一個帖帖子到某一個個帖子顯示出出來,帖子這這個記

32、錄是按按照發(fā)帖時間間倒序排列的的。三層嵌套套就是Oraacle對這這種問題的解解決方案,當當然每一種數(shù)數(shù)據(jù)庫有自己己的解決方式式。SQL面試題:有3個表S,CC,SC。SS(SNO,SNAMEE)代表(學學號,姓名);C(CNOO,CNAMME,CTEEACHERR)代表(課課號,課名,教教師);SCC(SNO,CNO,SSCGRADDE)代表(學學號,課程成成績)。問題:找出沒選過“黎黎明”老師課程的的所有學生姓姓名;列出2門以上(含含2門)不及及格學生姓名名及平均成績績;既學過1號課程程又學過2號號課程所有學學生姓名。請用標準SQLL語言寫出答答案,方言也也行(請說明明使用什么方方言)。s

33、elect snamee fromm s jooin scc on (s.snoo=sc.ssno) jjoin cc on (o=sc.noo) wheere c.cteaccher limingg; (2) seleect snname ffrom ss wherre snoo in (selecct snoo fromm sc wwhere scgraade =2); (3) seleect snname ffrom ss wherre snoo in (selecct snoo fromm sc wwhere cno=11 and sno = (sellect ssno frrom s

34、cc wherre cnoo=2);update 的作用相對對于對記錄進進行修改。用用法是upddate+表表名+sett+字段列表表及更新值過過濾條件;deelete+from+表名+過濾濾條件,刪除除某些字段。五接下來講數(shù)據(jù)據(jù)定義語言dddl語言。它實現(xiàn)了數(shù)數(shù)據(jù)表,視圖圖等的建立。事務trannsactiion就是一一系列的操作作,要么同時時完成要么不不完成,比如如轉賬操作要要對兩個賬戶戶updatte,不會出出現(xiàn)數(shù)據(jù)不一一致。對于OOraclee來說,一個個transscatioon起始于一一條dml語語句,然后一一系列的操作作rollbback回退退事務會結束;或commmit結束事事

35、務,再roollbacck也沒用;當遇到一條條dcl語句句或ddl語語句提交結束束事務;當正正常退出exxit時提交交結束事務,不不正常退出時時(如斷電)自自動回滾結束束事務。數(shù)據(jù)庫常用對象象是指它經(jīng)常常使用的一些些資源,比方方說表、視圖圖或其他資源源。下面講如如何創(chuàng)建一張張表,creeate ttable +表名+字字段及字段的的數(shù)據(jù)類型。Oraclle常用的數(shù)數(shù)據(jù)類型有變長字符串串varchhar2(最最長字符數(shù)即即上界4k)、定長字符串串char(所所占大?。?。有了變長字字符串后為什什么還要有定定長字符串呢呢?主要還是是效率問題,跟跟數(shù)組很像,但但是站空間,很很多結構、算算法都存在拿拿空

36、間換時間間問題,如HHashTaable。數(shù)字型nuumber(mm,n)m指指總共多少為為,n是小數(shù)數(shù)點后的位數(shù)數(shù);日期daate,包含含年月日時分分秒;變長字符串串long可可達2G,主主要是有些時時候一篇文本本相當長;存存圖片可以把把硬盤上圖像像的名字存到到數(shù)據(jù)庫里,也也可以把整張張圖片存到數(shù)數(shù)據(jù)庫里。創(chuàng)建一張表存放放學生數(shù)據(jù)如如:create tablee stu ( id nummber(88), name vvarchaar(20), sex nuumber(10), age nuumber(3), sdate date, grade numbeer(2) defauult 1,

37、class numbeer(2), email varchhar2(550) );sex取數(shù)字來來表示更節(jié)省省空間,入學學時日期加個個s避免和關關鍵字沖突,可可以為某些字字段指定默認認值當插入記記錄時沒有對對該字段賦新新值就以該默默認值,其他他沒有默認值值為nulll。五個約束條件件第一個叫非非空,第二個個叫唯一,第第三個叫主鍵鍵,第四個叫叫外鍵第五個個叫checck。當我們們創(chuàng)建這張表表的時候,有有一個最簡單單的條件字段段非空nott nulll。在Oraacle里面面約束條件也也可以看成一一個對象,能能為之取一個個名字,加一一個關鍵字cconstrraint+約束名,如如name varc

38、hhar(2) consstrainnt stuu_namee_nn nnot nuull,不起時系統(tǒng)統(tǒng)自動起名字字我們不用管管了。唯一約約束的意思是是在這個字段段里面所有的的記錄不能重重復,如id nnumberr(8) uuniquee,這屬于字段段級的約束;字段級的約約束有些限制制,比如要某某些字段組合合不能重復,還有就是兩個空值它不認為是重復的。要達到表級約束方法是在最后一個字段寫完后加一句如:constraint stu_name_email_uniunique(emaill,namee)。主鍵(primmary kkey)是可可以唯一標示示整條記錄的的東西,它代表表的意思是既既不能

39、為空又又不能重復,比如學生學號。E-mail做主鍵不好因為它可以為null,同時索引的時候數(shù)字比字符串效率高。如id number(8) primary key,也可以加在表級,如constraint stu_id_pk primary key(id),主鍵也可以是多個字段組合。外鍵約束建立立在一張表的的兩個字段上上或者是兩張張表的兩個字字段上,是比比較麻煩的一一種約束。在在emp和ddept就有有外鍵約束,往emp里加記錄的時候不允許再dept里沒有的部門編號。class number(2) references class(id),參考class這張表的id字段,當然也可以加在表級上:co

40、nstraint foreign key (class) references class(id),。注意在寫外鍵約束的時候,stu里的class叫參考字段,class里的id叫被參考字段,加外鍵的前提是被參考字段必須是主鍵。刪一條記錄的時候首先看有沒有其他字段參考它,有的話是無法刪除的,違反了完整約束條件。Check約束束用得比較少少,在寫miis系統(tǒng)時數(shù)數(shù)據(jù)在Javva程序里就就已經(jīng)校驗過過了。修改表表結構是在現(xiàn)現(xiàn)有表上修改改。在任何項項目開發(fā)時候候建表的SQQL語句是要要保存下來的的,所以可以以將表整個刪刪掉再建。添添加字段allter ttable +表名+aadd(字段段名+數(shù)據(jù)類類

41、型)如allter ttable dept22 add(dphonne varrchar22(11);刪除某個個字段如allter ttable dept22 dropp(dphoone);還還可以修改字字段的數(shù)據(jù)類類型,如果里里面已經(jīng)有數(shù)數(shù)據(jù)修改的后后果應不影響響原來存的記記錄值。在Oraclee里面看當前前用戶下有哪哪些表,哪些些約束,哪些些視圖等等這這些信息被單單獨地裝在一一張表里面,稱作數(shù)據(jù)字典表。user_tables里面裝的是當前用戶共有多少張表,里面字段可多了,我們關心的是table_name。查詢當前用戶下有哪些視圖:select view_name from user_vie

42、ws;查詢當前用戶下有哪些表:select table_name from user_tables;查詢當前用戶下有哪些約束:select constraint_name,table_name from user_constraints;。user_tables、user_constraints、user_views這些都是數(shù)據(jù)字典表,那么一共有多少個數(shù)據(jù)字典表呢?Oracle專門有另外一張表存放數(shù)據(jù)字典表的表叫做dictionary,它總共兩個字段一個叫table_name數(shù)據(jù)字典表的名字、還有一個叫comments對于這張數(shù)據(jù)字典表的描述??偣灿?00多個數(shù)據(jù)字典表,這就是Oracle的D

43、BA總是背著個小本本的原因,你要背是不可能的。索引就相當于字字典里的索引引一樣,它在在Oraclle里相當于于一種新的數(shù)數(shù)據(jù)庫對象,建立索引的方法create index idx_stu_emil on stu (email);也可以在字段組合上建立索引,以后在查詢組合時效率就高,刪除索引同刪除表方法類似。忘了自己有哪些索引可以采用select index_name from user_indexse;當你給某張表的字段加主鍵或唯一性約束的時候。建立索引的用處是當你建立了索引后取訪問相應數(shù)據(jù)的時候效率會很高。注意說的是讀的效率高了,但存的效率反而低了,因為你得同時往索引表里加索引值,會占用大量

44、的空間。記住一點不要輕易建立索引,除非覺得訪問量特別大時。視圖前面也提提過,它是一一張?zhí)摫?,嚴嚴格來講就是是一個子查詢詢。利用它可可以簡化我們們的查詢復雜雜度,同時它它也有不好的的地方,就是是表結構改了了它也得跟著著改動,增加加了維護的難難度。視圖有有些其他功能能,比如說我我有一個數(shù)據(jù)據(jù)庫,它里面面存了所有的的產品信息,而有一個供應商他想看我產品的信息,如果我把整張表都給他看那么關鍵信息他就全部都看走了,我的銷量有多少等等。我可以建立一個視圖里面只包含我想要給他看的內容。序列是Oraacle數(shù)據(jù)據(jù)庫獨有的東東西,它產生生一個唯一、不間斷的序序列,作用是是一般做主鍵鍵。如下我們們要存儲BBBS里

45、的帖子子建立一張表表:create tablee artiicle (id numbber,title vvarchaar2(10024),cont loong);如果要加入一篇篇文章,采用用這種做法sselectt max(id) ffrom aarticlle;然后知知道了id往往里插,但若若有另外一個個客戶端在做做數(shù)據(jù)插入同同時也在執(zhí)行行完上面一條條語句插入了了一條記錄就就會導致數(shù)據(jù)據(jù)不一致的現(xiàn)現(xiàn)象。為此我我們可以創(chuàng)建建一個seqquencee,每次插的的時候訪問它它的一個屬性性nextvval就會得得到不重復的的id,實際際上它是在內內部做了同步步的。六范式就是數(shù)據(jù)庫庫設計的一些些規(guī)則

46、,而它它又是由一個個姓范的提出的。講到設計其其實是很復雜雜的事情,不不能指望用幾幾條規(guī)則把所所有的都總結結出來(你在在造永動機,追追求銀彈siilver bulleet),所以有時要要具體問題具具體分析,該該打破三范式式的時候還是是要敢于打破破。三范式追求的的是這樣的目目標:不存在在冗余數(shù)據(jù),換換句話說就是是同樣的數(shù)據(jù)據(jù)不存第二遍遍。當然除了冗冗余性外還有有一些邊緣性性的要求,不不是很重要,講到的時候再說。第一范式的第第一個要求-要有主鍵;第二個要求求-列不可分分,不能說姓姓名我還要分分成姓和名。第二范式當一一張表里有多多個字段作為為組合主鍵的的時候,非主主鍵的字段不不能夠依賴于于部分主鍵,多

47、對多關系的表應分割成三張表,如前一個面試題。第三范式是不不能存在傳遞遞依賴,即除除了主鍵之外外的其他字段段必須直接依依賴于主鍵。比如empp表里的deeptno依賴于emppno,而lloc依賴于于empnoo所以不能放放一張表里。七PL_SQL是是Oraclle里面的一一個編程語言言,比較有用用,在Oraacle內部部寫一些存儲儲過程,觸發(fā)發(fā)器,函數(shù)?;旧厦恳灰环N數(shù)據(jù)庫都都有這么一個個語言,SQQL-Serrver叫做做T_SQLL,如果每個個都學比較累累,但是可以以取學一種然然后其他實在在要用時再查查上手要快很很多??赡芤砸院笪覀兘佑|觸的寫存儲過過程機會很少少,實際上我我們用SQLL和J

48、avaa程序就可以以解決大部分分問題了,這這只是讓大家家有個了解知知道有這么回回事。PL語言用來補補充SQL語語言的,因為為后者不帶有有分支和循環(huán)環(huán),對于有些些問題求解不不便,而過程程語言可以解解決。PL_SQQL寫程序非非常固定,分分為四塊,第第一塊叫deeclaree,聲明各種種變量和游標標的地方,可可選;第二個個叫begiin,就是說說程序從這開開始執(zhí)行了;excepption是是catchh到任何異常常時要執(zhí)行的的;end是是結束,后面面得有一個分分號。set serrverouutput on;begin dbms_ooutputt.put_line(hi,ppl_sqll!);en

49、d;/第一句是將內部部環(huán)境變量打打開,默認的的是關掉的,不不然看不到任任何輸出結果果。dbmss_outpput相當于于systeem.outt而put_line相相當于priintln。declaree v_namme varrchar22(20);begin v_namme := huannggangg; dbms_outpuut.putt_linee(v_naame);end;/變量名的寫法是是v_+名字字,聲明的時時候是變量名名在前,類型型在后;賦值值語句有點像像pascaal冒號等號號;declaree v_naame nuumber := 0; begin v_naame := 2

50、/v_name; dbmss_outpput.puut_linne(v_nname); excepttion whenn otheers thhen dbbms_ouutput.put_lline(Errorr!); end; /當檢測到異常時時才執(zhí)行exxceptiion,whhen otthers then 這樣做就相相當于一張大大網(wǎng)子,肯定定能把異常捕捕獲到。PL_SQLL變量聲明規(guī)規(guī)則:變量名名不能夠使用用保留字(OOraclee里保留字很很多所以推薦薦使用v_+名字,這樣樣不易沖突),如select、from等;第一個字符必須是字母;變量名最多包含30個字符;不要與數(shù)據(jù)庫的表或者列同

51、名;每一行只能聲明一個變量。常用變量類型7種:binary_integer整數(shù)主要是計數(shù)而不是用來表示字段類型(用來for循環(huán),數(shù)組下標,效率比較高,Oracle追求的目標);number數(shù)字類型;char定長字符串;date日期;long長字符串可達2GB;boolean布爾可取true、false或null值,建議大家布爾類型在用的時候一定要給一個初值,否則是null。declaree v_teemp nuumber(1); v_coount bbinaryy_inteeger :=0; v_sal numbeer(7,22) := 4000.00; v_datee datee := ss

52、ysdatte; v_pi cconstaant nuumber := 3.14; v_valiid booolean := faalse; v_namee varcchar2(20) nnot nuull :=myNaame; begin dbmss_outpput.puut_linne(v_temp valuee:|vv_datee); end; /dbms_ouutput.put_lline不能能打印處布爾爾類型的值。Constaant相當于于Java的的finall ,nott nulll對變量進行行限制。Oracle里里面的變量經(jīng)經(jīng)常用來存儲儲某一張表的的某個字段的的值,使用%typ

53、e屬屬性為了解決決表里字段的的變動與聲明明變量類型一一致。在PLL_SQL里里面可以使用用 兩個短橫橫線注釋掉一一行,注釋掉掉多行的時候候用/* */。declaree v_emmpno nnumberr(4);v_empnoo2 empp.empnno%typpe; v_emmpno3 v_emppno2%ttype; begin dbmss_outpput.puut_linne(Teest); end;%type可以以看做變量的的一個屬性,指指示其類型;引用某張表表某個字段方方法如v_eempno22 emp.empnoo%typee;。下面接著講PPL_SQLL里面復雜的的變量,可以以定

54、義復合變變量,有兩種種:Tablle相當于JJava里的的數(shù)組;Reecord相相當于Javva里的類,暫暫且這樣理解解。要指定ttable的的數(shù)據(jù)類型,比比較復雜是這這樣來做type type_tablee_emp_empnoo is ttable of emmp.emppno%tyype inndex bby binnary_iintegeer;typpe定義了一一種新的數(shù)據(jù)據(jù)類型名字叫叫type_tablee_emp_empnoo,然后可以以用它定義新新變量如 vv_empnnos tyype_taable_eemp_emmpno;。比較有意思思的是下標可可以取負值如如v_emppnos

55、(-1)。是什么促使了rrecordd類型數(shù)據(jù)的的出現(xiàn)呢?我我們現(xiàn)在寫的的是PL_SSQL,它最最主要用于操操縱表,表里里面有字段、記錄,如果果把一條記錄錄放一個變量量里以后用起起來要方便得得多。聲明這這種類型的方方式如:declaree type type_recorrd_deppt is recorrd( depttno deept.deeptno%type, dnamme deppt.dnaame%tyype, loc dept.loc%ttype); v_temmp typpe_reccord_ddept;begin v_temmp.depptno := 50; v_temmp.dna

56、ame := aaaaa; v_temmp.locc := bj; dbms_outpuut.putt_linee(v_teemp.deeptno| | v_ttemp.ddname);end;/這樣聲明還有一一個弊病,那那就是當字段段改變時控制制起來比較煩煩人,為此引引入rowttype屬性性來聲明reecord變變量。只需:declaree v_temmp deppt%rowwtype;begin v_temmp.depptno := 50; v_temmp.dnaame := aaaaa; v_temmp.locc := bj; dbms_outpuut.putt_linee(v_tee

57、mp.deeptno| | v_ttemp.ddname);end;/PL_SQL語語句里的seelect語語句只能返回回一條記錄,且且selecct語句里面面必須有個iinto或使使用游標,還還要保證有且且僅有一條記記錄被返回,這這是它比較特特別的地方,不不然會報錯。在PL_SSQL里面使使用inseert、deelete、updatte后加上ccommitt不然起不了了作用有時,只只不過。同時還有這這么一個需求求-執(zhí)行上述述語句以后有有多少條記錄錄受影響(除除selecct,對它來來說沒多大意意義),這樣樣做:dbms_ouutput.put_lline(ssql%roowcounnt|條

58、記錄錄受影響);sql代代表剛剛執(zhí)行行完的sqll語句,而rrowcouunt代表剛剛剛執(zhí)行完的的sql語句句影響了多少少條記錄。如果在PL_SQL里創(chuàng)創(chuàng)建一張表得得這樣寫:eexecutte immmediatte crreate tablee T(nnnn varrchar22(20) deffault aaaa);由于外面已已經(jīng)有單引號號了所以里面面的一個單引引號得用兩個個代表一個。defauult是給一一個默認值。PL_SQL里里條件語句是是形如if (條件) then elsiif (條件件) theen elsee end if;注意意最后一個eelse后沒沒有thenn,其他條件

59、件后有,而且且elsiff沒有那個ee,最后以eend iff;結束。PL_SQL里里也有三種循循環(huán),首先看看第一種,如如下:declareei binarry_intteger :=0;begin loopdbms_ouutput.put_lline(ii);i:= i+11;exit whhen (ii=11); end lloop;end;這也類似于Jaava里的ddo -whhile循環(huán)環(huán);第二種,如下:declaree j binnary_iintegeer :=11;begin whilee j111 looppdbms_ouutput.put_lline(jj);j := j+1

60、; end lloop;end;這也類似于Jaava里的wwhile循循環(huán);第三種,如下:beginbeginfor k iin 1.10 looopdbms_ouutput.put_lline(kk);end looop; for k in reeversee 1.110 looop dbms_ooutputt.put_line(k); end looop;end;這類似于Javva里的foor循環(huán),rreversse表示逆序序循環(huán),1.100指定循環(huán)范范圍。PL_SQL里里也可以逮某某種類型的錯錯誤,Javva里每一種種excepption都都有相應的類類為代表,同同理PL_SSQL里也一

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論