淘寶網(wǎng)開發(fā)人員數(shù)據(jù)庫知識手冊_第1頁
淘寶網(wǎng)開發(fā)人員數(shù)據(jù)庫知識手冊_第2頁
淘寶網(wǎng)開發(fā)人員數(shù)據(jù)庫知識手冊_第3頁
淘寶網(wǎng)開發(fā)人員數(shù)據(jù)庫知識手冊_第4頁
淘寶網(wǎng)開發(fā)人員數(shù)據(jù)庫知識手冊_第5頁
已閱讀5頁,還剩111頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

淘寶網(wǎng)開發(fā)人員數(shù)據(jù)庫知識參考手

編寫、修訂、審核記錄編號文檔版本修訂章節(jié)修訂原因修訂日期修訂人11.0全文新建文檔2007-9-27勝通22.0補充文檔2008-1-6勝通345678910目錄TOC\o"1-5"\h\z\o"CurrentDocument"第一章基本元素 6\o"CurrentDocument"第一節(jié)數(shù)據(jù)類型 6\o"CurrentDocument"1. VARCHAR2(size): 6\o"CurrentDocument"LONG 7\o"CurrentDocument"CLOB 7\o"CurrentDocument"DATE 8\o"CurrentDocument"TIMESTAMP(factional_seconds_precision) 8\o"CurrentDocument"第二節(jié)NULL 8\o"CurrentDocument"第三節(jié)偽列 11\o"CurrentDocument"CURRVAL和NEXTVAL 11\o"CurrentDocument"LEVEL 12\o"CurrentDocument"ROWNUM 13\o"CurrentDocument"第四節(jié)注釋 15\o"CurrentDocument"第五節(jié)數(shù)據(jù)庫的對象 16\o"CurrentDocument"1. 模式對象 163. 部分模式對彖 17第六節(jié)格式模型 17第七節(jié)操作符 19操作符列表 19操作符優(yōu)先級 19連接操作符 19集合操作符 19第二章表達式 19第三章條件 19\o"CurrentDocument"第一節(jié)條件的優(yōu)先級 20\o"CurrentDocument"第二節(jié)比較條件 21第三節(jié)邏輯條件 23第四節(jié)成員關(guān)系條件 23第五節(jié)范圍條件 23第六節(jié)NULL條件 23\o"CurrentDocument"第四章函數(shù) 23第一節(jié)單值函數(shù) 23\o"CurrentDocument"數(shù)值型函數(shù) 24<MOD 24\o"CurrentDocument"。ROUND 24\o"CurrentDocument"令 ACOS 26\o"CurrentDocument"? ATAN 27? BIN_TO_NUM 29令 BITAND 29令 CEIL 29? COS 29? FLOOR 29\o"CurrentDocument"令 SIN 29令 SINH 29\o"CurrentDocument"返回字符值的字符型函數(shù) 29\o"CurrentDocument"UPPER 30\o"CurrentDocument"RPAD 31\o"CurrentDocument"LTRIM 32\o"CurrentDocument"REPLACE 33\o"CurrentDocument"SOUNDEX 33\o"CurrentDocument"SUBSTR 34\o"CurrentDocument"TRANSLATE 3536\o"CurrentDocument"返回數(shù)字值的字符型函數(shù) 36\o"CurrentDocument"令 INSTR 36? 37\o"CurrentDocument"日期函數(shù) 37\o"CurrentDocument"ADD_MONTHS 38\o"CurrentDocument"CURRENT_DATE 39\o"CurrentDocument"CURRENT.TIMESTAMP 40\o"CurrentDocument"SYSDATE 40\o"CurrentDocument"SYSTIMESTAMP 41\o"CurrentDocument"NEXT_DAY 42\o"CurrentDocument"MONTHS.BETWEEN 42\o"CurrentDocument"ROUND 43\o"CurrentDocument"TRUNC 44\o"CurrentDocument"轉(zhuǎn)換函數(shù) 45\o"CurrentDocument"令 TO.CHAR 45\o"CurrentDocument"其他輔助函數(shù) 47\o"CurrentDocument"GREATEST 49\o"CurrentDocument"LEAST 49\o"CurrentDocument"NVL 50SYS_CONNECT_BY_PATH 52SYS_CONTEXT 52\o"CurrentDocument"第一節(jié)聚集函數(shù) 52°AVG 54。FIRST. 58。MIN 59\o"CurrentDocument"第二節(jié)分析函數(shù) 60\o"CurrentDocument"1.概述 60評62\o"CurrentDocument".常用的分析函數(shù) 65\o"CurrentDocument"令COUNT 66\o"CurrentDocument"? LAST.VALUE 67\o"CurrentDocument"令 MIN 69常見問題 73計算動態(tài)累計問題 73TOP-N問題 73交叉查詢問題 73?移除重復(fù)值問題 73第四節(jié)對象引用函數(shù) 73第五節(jié)函數(shù)列表(字母序) 73ABS 73ACOS 73ADD_MONTHS 73\o"CurrentDocument"ASCII 74\o"CurrentDocument"ASIN 74\o"CurrentDocument"ATAN 74\o"CurrentDocument"A7AN2 74\o"CurrentDocument"AVG 75\o"CurrentDocument"BIN^TO_NUM 75\o"CurrentDocument"B1NAND 75\o"CurrentDocument"CHARTOROWID 76\o"CurrentDocument"COUNT. 76\o"CurrentDocument"CURRENT_DATE. 76\o"CurrentDocument"CURRENT』MESTAMP 76\o"CurrentDocument"DECODE 76\o"CurrentDocument"DENSE_RANK 77DUMP 77FIRST. 77\o"CurrentDocument"79. FIRST_VALUE. 77FLOOR 77GREATEST 77GROUPJD 77GROUPING 77GROUPING」D 77LAG 77\o"CurrentDocument"LAST 78\o"CurrentDocument"LAST_DAY 78\o"CurrentDocument"LAST_VALUE 78\o"CurrentDocument"LEAST. 78\o"CurrentDocument"LENGTH 78\o"CurrentDocument"MAX 78\o"CurrentDocument"MIN 79\o"CurrentDocument"MOD 79\o"CurrentDocument"MONTHS_BETWEEN 79\o"CurrentDocument"NVL 79\o"CurrentDocument"RANK 79\o"CurrentDocument"ROUND(clate) 80\o"CurrentDocument"ROUNDmumber) 80\o"CurrentDocument"ROW_NUMBER 80\o"CurrentDocument"RPAD 80SYSTIMESTAMP 81TO_DATE 81TRANSLATE 81\o"CurrentDocument"TRIM 81TRUNC(number) 81UPPER 81第五章后記 82第一章基本元素第一節(jié)數(shù)據(jù)類型VARCHAR2(size):可變長度的字符串,最大size個字節(jié)。size最大可取值是4000,如果你指定了size是4000,然后插入超過4000子句的字符串,oracle會字段截取先進入庫的4000字節(jié),后面的它就不管了。如果你知道的size沒有4000,而是其他一個數(shù)字如200,那么如果你插入的字符串超過200,oracle就會返回一個錯誤。size必須指定個正數(shù)。有關(guān)VARCHAR類型,它其實和VARCHAR2一樣,是它的同義詞。但是不宜指定VARCHAR作為數(shù)據(jù)類型,因為你不確定oracle哪天頭腦發(fā)熱,把VARCHAR的含義改掉了或者不支持它,那就完了。CHAR(size)固定長度的字符串,最大size個字節(jié)。如果你插入的字符串沒有size個字節(jié),那么oracle就會使用空白來填充它。size最大可取值是2000,如果你指定了size是2000,然后插入超過2000子句的字符串,oracle會字段截取先進入庫的4000字節(jié),后面的它就不管了。如果你知道的size沒有2000,而是其他一個數(shù)字如200,那么如果你插入的字符串超過200,oracle就會返回一個錯誤。如果你不指定size,那么它的默認值就是1。LONG用于存儲字符串,最多可以存儲2G個字節(jié)的字符。LONG類型有很多的限制,已經(jīng)不被oracle推薦使用,大家最好不要用,會有一系列操作限制,導(dǎo)致一些隱形的問題。CLOB存儲字符串,即支持可變長度的,也支持固定長度的字符串,最大可支持到4G字節(jié)。NUMBER(p,s)oracle中唯一存儲數(shù)字的數(shù)據(jù)類型。最大最小值分別為9.99...999X1()125(38個9后面跟了88個0,因此它的數(shù)字精度就是38)和1.0X10T30。如果你使用的數(shù)字超過這個數(shù)字,那么oracle返回錯誤。p表示這個數(shù)字一共有多少個數(shù)字組成,范圍是從1到38。S就表示0右邊的精度有多少位,就小數(shù)是多少位,范圍是-84到127。p和s要么都不指定,就表示范圍是使用最大值,即p=38,s=127:要么就指定p,那么S=0;要么都必須同時指定。不存在只指定S不指定p的情況。下面給個例子,來詳細說明這個類型:下面正常情況下,S的值小于P的情況:實際數(shù)據(jù)指定的類型結(jié)果說明1234567.89NUMBER1234567.89沒有變化1234567.89NUMBER(9)1234567小數(shù)沒有了1234567.89NUMBER(9,2)1234567.89沒有變化1234567.89NUMBER(9,1)1234567.9小數(shù)只有1位,四舍五入了1234567.89NUMBER(6)錯誤超過了最大數(shù)字精度范圍1234567.89NUMBER(7,-2)1234500s為負數(shù),則在0左邊截取1234567.89NUMBER(7,2)錯誤超過最大數(shù)字精度范圍7下面是“不正常”情況,S的值大于P的值的情況:實際數(shù)據(jù)指定的類型結(jié)果說明0.01234NUMBER(4,5)0.01234沒有變化0.00012NUMBER(4,5)0.00012沒有變化0.000127NUMBER(4,5)0.0013超過指定小數(shù)位數(shù)的范圍了,四舍五入0.0000012NUMBER(2,7)0.0000012沒有變化0.00000123NUMBER(2,7)0.0000012超過指定小數(shù)位數(shù)的范圍了,四舍五入從上面的例子可以看到,S是表示小數(shù)點右邊的有多少個數(shù)字,即有多少為小數(shù),如果它為負值,那么就表示小數(shù)點左邊有多少位數(shù)字;當所指定的數(shù)字超過了這個S精度指定的訪問,那么oracle就執(zhí)行四舍五入。p表示的是一共有多少為有效數(shù)字,不能超過這個有效數(shù)字,超過了就返回相應(yīng)的錯誤。DATE時間類型,oracle存儲時間的數(shù)據(jù)包括:世紀、年、月、日、時、分、秒。可見它只精確到秒級別。往date類型你們插入數(shù)據(jù)要使用函數(shù)to_date(),把date類型數(shù)據(jù)轉(zhuǎn)換為字符串類型數(shù)據(jù),要使用to_char()函數(shù)。有關(guān)日期的計算:可以對日期進行加、減計算,不能對其進行乘法和除法運算。指定一個數(shù)字,oracle對其附加天作為單位來和日期進行計算。如sysdate-1就表示昨天,sysdate+1就表示明天,sysdate-7就表示一周以前,而sysdate-10/1440就表示10分鐘以前。TIMESTAMP(factional_seconds_precision)TIMESTAMP表示時間戳類型,就是一個時間點。oracle存儲的時間戳數(shù)據(jù)包括:年、月、日、時、分、秒??梢娝淮鎯κ兰o。對于faction_seconds_precision,表示將秒精確到哪個級別,它的值是從0到9,默認是6,如果是3,就表示把秒精確到毫秒級別,9就表示精確到“納米”級別。看個例子就明白了:SQL>selectto_char(systimestamp,*yyyy-mm-dd,hh24:mi:ssxfr)timefromdual;TIME2007-09-19,11:20:41.035829存儲TIMESTAMP類型,要使用TO_TIMESTAMP()函數(shù),顯示TIMESTAMP類型數(shù)據(jù)要使用TO_CHAR()函數(shù),如例子中那樣。第二節(jié)NULLnull表示novalue,unknown,它不表示0,也不表示一個空的字符串。SQL函數(shù)中的NULL所有的函數(shù),除了REPLACE,NVL,CONCAT以外,如果你用null作為它的參數(shù),那么結(jié)果就是返回nulL大部分的聚集函數(shù)如(COUNT,AVG),他們會忽略null,如一個列上面有10行記錄,其中2行是null.那么count這個列的結(jié)果就是8。例如在增加月份函數(shù)中使用null進行計算的情況:SQL>selectto_char(sysdate,*yyyy-mm-dd,)todayfromdual;TODAY2007-09-23SQL>selectto_char(addmonths(sysdate,1),,yyyy-mm-dd,)another_dayfromdual;ANOTHERDA2007-10-23SQL>selectto_char(addmonths(sysdate,null),*yyyy-mm-dd,)another_dayfromdual;ANOTHER_DA聚集函數(shù)的情況:22:11:28SQL>selectempno,ename,commfromemp;EMPNOENAMECOMM7369SMITH7499ALLEN 3007521WARD 5007566JONES7654MARTIN14007698BLAKE7782CLARK7788SCOTT7839KING7844TURNER07876ADAMS7900JAMES7902FORD7934MILLER已選擇14行。22:11:43SQL>selectcount(empno)fromemp;COUNT(EMPNO)1422:12:05SQL>selectcount(comm)fromemp;COUNT(COMM)4條件中的null.對NULL所進行的任何數(shù)學(xué)計算結(jié)果都是null,如10+null結(jié)果是nulLoracle始終認為兩個null是不相等的(除了少數(shù)情況),不能用null=null這個條件來進行判斷兩個null是否相等,null不等于其他的null,你只能用isnull或者isnotnull來判斷某個記錄的某個字段是不是null,但是oracle在使用decode函數(shù)的時候,它認為兩個null是相等的。oracle還有一種情況也認為兩個不同的null是相等的,就是在一個復(fù)合鍵中,如果這兩個復(fù)合鍵值中非null部分是相等的,那么這兩個復(fù)合鍵值是相等的。下面給出null出現(xiàn)的條件表格:如果a是比較條件是那么結(jié)果是10aISNULLFALSE10aISNOTNULLTRUENULLaISNULLTRUENULLaISNOTNULLFALSE10a=NULLUNKNOWN(其實就是null)10a!=NULLUNKNOWNNULLa=NULLUNKNOWNNULLa!=NULLUNKNOWNNULLa=10UNKNOWNNULLa!=10UNKNOWN例如:SQL>selectempno,ename,commfromemp;TOC\o"1-5"\h\zEMPNOENAME COMM7369SMITH7499ALLEN 3007521WARD 5007566JONES7654MARTIN 14007698BLAKE7782CLARK7788SCOTT7839KING7844TURNER 07876ADAMS7900JAMES7902FORD7934MILLER已選擇14行。SQL>selectempno,ename,commfromempwhereconun=null;未選定行SQL>selectempno,ename,commfromempwherecomm<>nul1未選定行SQL>selectempno,ename,commfromempwherecommisnul1EMPNOENAME COMM7369SMITH7566JONES已選擇10行。SQL>selectempno,ename,commfromempwherecommisnotnull;EMPNOENAME COMMTOC\o"1-5"\h\z7499ALLEN 3007521WARD 5007654MARTIN 14007844TURNER 0第三節(jié)偽列偽列就像是一個表的列,但卻不是,它不存儲在表中。你可以對偽列進行查詢,而卻不能進行增刪改。偽列包括下面幾類:1.CURRVAL和NEXTVAL這兩個偽列主要是用于訪問序列(sequence)的值。currval返回當前值,而nextval返回下一個值并且導(dǎo)致sequence一次值的增加。你只能通過下列的形式來訪問這兩個偽列:sequencename.CURRVALsequencename.NEXTVAL哪里可以使用sequence的值?1、查詢語句的select部分,但不是在子句的select中,如selectafrom(selectbfrom。。。),這個里面b就在查詢語句的子句的select中,可以使用sequence的位置(即使用currval和nextval的地方)是在a這個部位。2、insert語句的子句select部分中,如insertintotselectafrom。。。,就是在a這個位置。3、insert的value子句中,如insertintotvalues(a…),就是在a這個位置。4、update的set子句中,如UPDATETseta。。。,就是在a這個位置。哪些情況對sequence值的使用有限制,即currval和nextval不能使用的場合?1、DELETE,SELECT,UPDATE的子句,如deletefromtwhereain(selecta….),這個a位置不能使用。2、在查詢視圖和物化視圖的語句中不能使用。3,包含DISTINCT關(guān)鍵字的查詢語句中不能使用。4、包含GROUPB丫和ORDERBY子句的查詢語句中不能使用。5、集合操作中不是第一個select語句的語句中不能使用,如SELECTa...UNIONALLSELECTb..?這里b的位置不能使用,a位置能用。6、WHERE中的select子句,如SELECT...FROM...WHERE(SELECTa...)中a的位置。7、在createtable和altertable中,某個有default值的列上不能使用.check約束中不能使用。如何使用序列值?當你建立一個序列的時候,你會指定這個序列的第一個值和增加值,當你在第一次調(diào)用這個序列的時候,你不能使用sequencename.CURRVAL來訪問它的當前值,因為它還沒開始,而必須使用sequencename.NEXTVAL來讓它開始初始化第一個值,第一次使用這個時候返回的時候是序列的第一個值。之后在時候currval是返回序列的當前值,nextval返回序列的下一個值并且導(dǎo)致序列增加一個值。oracle對序列的增加只是一次性的,單向的,即它只增加,不能減少,并且只能增加一次。下面給個簡單的例子:SQL>createsequenceseq_teststartwith1incrementby1nomaxvalue;——創(chuàng)建序歹U,第?值I,每次增加1Sequencecreated.SQL>selectseq_test.currvalfromdual; 第一次必須通過nextval讓序列初始化selectseq_test.currvalfromdualERRORat1ine1:0RA-08002:sequenceSEQ_TEST.CURRVALisnotyetdefinedinthissessionfromdual;第一次初始化序列,讓它得到第一值fromdual;第一次初始化序列,讓它得到第一值1NEXTVAL1SQL>selectseq_test.currvalfromdual;當前值CURRVAL1SQL>selectseq_test.nextvalfromdual;一不是第一次,nextval返回下個值,并且序列增加1NEXTVAL2SQL>selectseq_test.currvalfromdual;經(jīng)過nextval后,序列的確增加「CURRVALLEVELROWIDrowid顧名思義就是某條記錄在數(shù)據(jù)庫中的存儲地址,在9i中它包括下列內(nèi)容:1、這條記錄屬于哪個對象的,記錄了這個對象在數(shù)據(jù)庫中id。2,這條記錄屬于數(shù)據(jù)文件的哪個塊的3、這條記錄是數(shù)據(jù)塊的哪個行(這個行就記錄了這條數(shù)據(jù))4、這條記錄屬于哪個數(shù)據(jù)文件,以數(shù)據(jù)文件的id表示。因此rowid能夠快速的定位到數(shù)據(jù)在數(shù)據(jù)庫中的位置,因此通過rowid來訪問數(shù)據(jù)一般都是比較快的。一般情況下,rowid具有唯一性,即一條記錄一個rowid,但是在cluster中,多個表的公用部分是只存一個記錄的,因此所有這些表的公用部分一個記錄就一個rowid,其實那還是一個記錄一個rowidorowid偽列具有rowid類型或者是urowid類型。rowid反映的是當前這個記錄在數(shù)據(jù)庫中的“邏輯”位置,即它是哪個對象的在哪個數(shù)據(jù)文件的哪個塊的哪個行上,所以,當使用導(dǎo)入導(dǎo)出工具進行移動數(shù)據(jù)以后,rowid會發(fā)生變化,類似發(fā)生變化的還有如oracle對物理文件進行了相關(guān)的接合整理也會出現(xiàn)整理前后rowid發(fā)生變化等。你可以在語句的select部分以及where部分中使用rowid這個偽列。注意它是偽列,即它不在表中存儲,你只能查詢而不能增刪改。下面給個小例子:SQL>selectt.*,rowidfromdeptt;ROWIDDEPTNODNAMELOG10ACCOUNTINGNEWYORKAAAMfNAAEAAAAAQAAA20RESEARCHDALLASAAAMfNAAEAAAAAQAAB30SALESCHICAGOAAAMfNAAEAAAAAQAAC40OPERATIONSBOSTONAAAMfNAAEAAAAAQAADSQL>select*fromdeptwhererowid=,AAAMfNAAEAAAAAQAAA';DEPTNODNAME l.OC10ACCOUNTINGNEWYORKROWNUM語句查詢語句所返回的每一行記錄,Oracle會給其指定一個順序的數(shù)字(rownum),用于標志順序,第一行記錄是1,第一行記錄是2,依此類推。你可以通過rownum來實現(xiàn)限制返回的行數(shù)的目的,即在條件判斷中使用rownum小于或者小于等于某個數(shù)的情況,請看下面這個例子:SQL>selectrownum,empno,enamefromempwhererownum<3;ROWNUMEMPNOENAME1 7369 SMITH2 7499 ALLENSQL>selectrownum,empno,enamefromempwhererownum<=3;ROWNUM EMPNO ENAME1 7369 SMITH2 7499 ALLEN3 7521 WARDROWNUM一般只能用于v或<=的情況,rownum使用=的時候只能是1,不能是其他任何數(shù),否則不會返回結(jié)果,請看一個例子:SQL>selectrownum,empno,enamefromempwhererownum=l;ROWNUMEMPNOENAME7369SMITH

SQL>selectrownum,empno,enamefromempwhererownum=2;未選定行SQL>selectrownum,empno,enamefromempwhererownum=3:未選定行為什么呢?如果指定的條件是ROWNUM=2的話,對于滿足其他條件的第一條記錄如果返回的話ROWNUM=1,但是這不滿足ROWNUM=2的條件,因此這條記錄不會返回。找到下一條記錄,這時候ROWNUM仍然等于1,因為目前還沒有返回1條符合的數(shù)據(jù),同理這條記錄也不會滿足ROWNUM=2的條件,也不會返回直到最后一條,都不會滿足ROWNUM=2的條件。所以指定非1的值只能返回?zé)o。rownum使用〉的時候只能大于?;蜇摂?shù),而這沒有任何意義,因此一般不會出現(xiàn)大于的情況。由上面的例子,可以看出rownum是出現(xiàn)在where子句中和select子句中的,where的執(zhí)行是在orderby子句執(zhí)行的前面,因此當有orderby的時候,rownum如果顯示出來就會出現(xiàn)順序錯亂的現(xiàn)象,請看下面這個例子:SQL>selectrownum,empno,enamefromempwhererownum<=3orderbyename;ROWNUMEMPNOENAME2 7499 ALLEN1 7369 SMITH3 7521 WARD由此我們可以聯(lián)想到這樣一類句子怎么去做,就是返回某個表的前(后,最)多少行,請看下面這個例子,返回emp表的前(后)3行:SQL>selectrownum,empno,enamefromemp;ROWNUMEMPNOENAMErownum<=3;ROWNUMrownum<=3;ROWNUMEMPNOENAME17369SMITH27499ALLEN37521WARD47566JONES57654MARTIN67698BLAKE77782CLARK87788SCOTT97839KING107844TURNER117876ADAMS127900JAMES137902FORD147934MILLER已選擇14行。SQL>selectrownum,empno,enamefrom(selectt.empno,t.enamefromemptorderbyempno)where1 7369SMITH2 7499ALLEN3 7521WARDSQL>selectrownum,empno,enamefrom(selectt.erapno,t.enamefromemptorderbyempnodesc)whererownum<=3;ROWNUMEMPNOENAME1 7934 MILLER2 7902 FORD3 7900 JAMES上面這種似乎大家還是不是很滿意?因為你得到的所有最多少條,是經(jīng)過某個列的排序以后才得到的,那么如何得到?jīng)]有經(jīng)過排序的,即你們認為在表中原始存儲的后10條數(shù)據(jù)呢(前10條太簡單了,之間rownum<11就可以了),或者是取道中間的第2到第3條數(shù)據(jù)呢?這個時候,我們就可以利用嵌套查詢來實現(xiàn)這個操作,請看下面這個例子:SQL>select*from(selectrownumasrn,tl.empno,tl.enamefromemptl)wherern>2andrn<5;RNEMPNOENAME3 7521WARD4 7566JONESSQL>select*from(select*from(selectrownumasrn,tl.empno,tl.enamefromemptl)orderbyrndesc)whererownum<3;RNEMPNOENAME14 7934MILLER13 7902FORDXMLDATA第四節(jié)注釋在sql語句內(nèi)部的注釋不會影響到語句的執(zhí)行,但是卻能增加語句的可讀性與可維護性。它可以出現(xiàn)在任何的關(guān)鍵字,參數(shù)和標點符號之間。有兩種注釋形式:1、以“/*”開始,以結(jié)束,在這之間的所有東西都是注釋部分,可以跨行,多行注釋。2、以“-”開始,此行之后的所有部分為注釋,不能跨行,單行注釋。第五節(jié)數(shù)據(jù)庫的對象.模式對象一個模式(schema)就是數(shù)據(jù)庫的數(shù)據(jù)邏輯結(jié)構(gòu)的集合,或稱模式對象。一個模式屬于一個數(shù)據(jù)庫的用戶,并且它的名字就是用戶的名字,如在數(shù)據(jù)庫中有一個taobao用戶,那么在數(shù)據(jù)庫中就有一個taobao模式,taobao用戶的所有對象的集合就稱為taobao模式。因此,很多情況下,它們兩個通用。既然模式對象和某個用戶是相互對應(yīng)關(guān)聯(lián)的,也就是說某個用戶存在的時候,其相對應(yīng)的模式對象才有存在的意義,因此對應(yīng)的用戶被刪除以后,其所對應(yīng)的模式對象也將全部被刪除,基于這些模式對象而建立起來的其他的對象都將失效,如a用戶存儲過程p是中引用了b用戶的表t,那么b被刪除以后,t被刪除,p不會被刪除,但是p過程就失效了。下面列出數(shù)據(jù)庫的模式對象:名稱解釋ClustersConstraintsDatabaselinksDatabasetriggersDimensionsExternalprocedurelibrariesIndex-organizedtablesIndexesIndextypesJavaclassesJavaresourcesJavasourcesMaterializedviewsMaterializedviewlogsObjecttablesObjecttypesObjectviewsOperatorsPackagesSequencesStoredfunctionsstoredproceduresSynonymsTablesViews

.非模式對象非模式對象,與模式對象進行對照,很顯然,它是不會隨著用戶的消失而離開的獨立的數(shù)據(jù)庫對象,它包括:名稱解釋ContextsDirectoriesParameterfiles(PFILEs)Serverparameterfiles(SPFILEs)ProfilesRolesRollbacksegmentsTablespacesUsers具有諷刺意味的是user也)是非模式對象,可以這樣理解用戶a獨立于、不依賴于用戶b而存在。.部分模式對象第六節(jié)格式模型1.時間格式元素表示含義/>“test”這些標點符號和具體的字符串,最終會顯示出來,其實他們啟到的作用就是分隔,如下面這個日期:2007-9-16這里符合“-”就啟到了分隔年月日的作用。ADA.D.公元后BCB.C.公元前AMA.M.早上,上午PMP.M.卜午D一周的第幾天,星期天是1

DAY星期幾,,一共用9個字符大小來顯示,如果沒有這么長,名稱的右邊用空格來填充DD一個月的第幾天,11?31]DDD一年的第幾天,[1-366】DY星期幾,但是是簡稱,如周一可能就是MONFF[O..9]這個是用于timestamp類型的,用于表示將秒分成多少位數(shù)來表示,在FF后面跟上一個0到9的數(shù)字。HH小時,【1?12】HH12小時,【1?12】HH24小時,【0?23】MI分鐘,【0?59】MM月份,MON月份,但是是月份的簡稱,如1月可能是JAN來表示MONTH月份,月份的名稱,如9月可能是September來表示,一共用9個字符大小來顯示,如果沒有這么長,名稱的右邊用空格來填充Q季節(jié),[1,2,3,4]分別代表春夏秋冬SS秒,【0?59】SSSS從午夜0秒開始計算到現(xiàn)在的秒數(shù)ww一年的第幾個周,【1?53】w一個月的第幾個周,【1?5】Y,YYY年份,中間有個逗號YEARSYEAR年份,用字符串顯示,S表示指示公元前(BC)使用表示YYYYSYYY4個數(shù)字的年份,S表示指示公元前(BC)使用表示YYYYYY分別表示年份的后面三個、兩個、一個數(shù)字第七節(jié)操作符.操作符列表.操作符優(yōu)先級.連接操作符.集合操作符第二章表達式第三章條件所謂條件就是通過計算指定的一個或者多個表達式和邏輯操作,而返回一個布爾值TRUE、FALSE或者UNKNOWN。條件可以分為很多種類型,有以下幾類:condition::=屋8mparisonconditioi)^conditioncondition-^membershipconditionj--^rangecondition^ <nullcondition)(equalspath) (existscondition) -ZlikeconditiorA <isoftypecondition)—(underpath) dconditiondcondition那么條件在一個語句中的哪些位置可以放置呢?可以在下列位置放置:1、WHERE子句中2、STARTWITH子句中(大家很少用到)3、CONNECTBY子句中(大家也很少用到)4、HAVING子句中另外簡單的條件是可以相互組合成一個復(fù)雜的條件,如(1=1)AND(5=7)o第一節(jié)條件的優(yōu)先級那么當許多條件在一起的時候,哪個先執(zhí)行,哪個后執(zhí)行呢,即條件的優(yōu)先級是什么呢?下面以優(yōu)先級從高到低的順序來列出條件的優(yōu)先級:條件類型說明SQL操作符如加減乘除,請參考操作符的優(yōu)先級=!=<><=>=比較IS[NOT]NULLLIKE[NOT]BETWEEN[NOT]IN比較

EXISTSISOFtypeNOT求累、邏輯否定AND連接,邏輯與OR分離,邏輯或第二節(jié)比較條件比較條件,顧名思義,它就是比較兩個表達式的,它的結(jié)構(gòu)返回一個布爾類型的值TRUE,FALSE或UNKNOWN。下面是比較條《二的列表:比較條件說明=相等的比較!=,"=,<>不等的比較,有些平臺不能使用某些符號>,<大于,小于>=,<=大于或等于,小于或等于ANYSOME它的左邊是一個值,它的右邊是一系列值或者一個查詢子句(它返回一個或者多個值),它的功能就是比較左邊的是否在右邊之中。如果它右邊是一個查詢子句,當這個查詢子句無返回值的時候,那么整個比較條件返回FALSE,這兩個比較操作必須跟在=,仁,>,<,>=,<=的后面。ALL和some,any的要求一樣,只不過它的功能是比較它左邊的值對右邊值的比較必須所有的都正確結(jié)果才為TRUE,否則為FALSE?如果它右邊是一個查詢子句,當這個查詢子句無返回值的時候,那么整個比較條件返回TRUE。它必須跟在=,!=,>,<,>=,<=的后面。關(guān)于any和some以及all,我想來做個實驗,說明它們的作用。首先請看下面的數(shù)據(jù)分布情況:SQL>select*fromdept;DEPTNODNAME LOG10ACCOUNTINGNEWYORK20RESEARCHDALLAS30SALESCHICAGO40OPERATIONSBOSTON對any、some進行一個正確的等值判斷,請看結(jié)果:SQL>selectdeptno,dnamefromdeptwhere*BOSTON,=any(selectlocfromdept);DEPTNODNAME10ACCOUNTING20RESEARCH30SALES40OPERATIONSSQL>selectdeptno,dnamefromdeptwhere*BOSTON*=some(selectlocfromdept);DEPTNODNAME10ACCOUNTING20RESEARCH30SALES40OPERATIONS下面在對any,some進行一個錯誤的等值判斷,請看結(jié)果:SQL>selectdeptno,dnamefromdeptwherethangzhou,=any(selectlocfromdept);norowsselectedSQL>selectdeptno,dnamefromdeptwhere*hangzhou,=some(selectlocfromdept);norowsselected下面再對它們進行一個不等值判斷,情況結(jié)果:SQL>selectdeptno,dnamefromdeptwherel>any(0,1,3);DEPTNODNAME10ACCOUNTING20RESEARCH30SALES40OPERATIONSSQL>selectdeptno,dnamefromdeptwherel>some(0,1,3);DEPTNODNAME10ACCOUNTING20RESEARCH30SALES40OPERATIONSSQL>selectdeptno,dnamefromdeptwherel>any(1,3);norowsselectedSQL>selectdeptno,dnamefromdeptwherel>some(1,3);norowsselected下面再看一下,如果它們右邊的值為空的情況:SQL>selectdeptno,dnamefromdeptwherel>any(selectnullfromdual);norowsselectedSQL>selectdeptno,dnamefromdeptwherel>some(selectnul1fromdual);norowsselected由上面的實驗可以知道,any與some在做比較條件的時候,它們的功能以及作用是一樣的,沒有區(qū)別,另外還可以加深一個印象,那就是它們的計算結(jié)果是一個布爾值。下面看一下ALL的情況:SQL>selectdeptno,dnamefromdeptwhere*BOSTON*=all(selectlocfromdept);norowsselectedSQL>selectdeptno,dnamenorowsselectedfromdeptwhereKalKl^,3);SQL>selectdeptno,dnameDEPTNODNAMEfromdeptwhereKal1(2,3);10ACCOUNTING20RESEARCH30SALES40OPERATIONSSQL>selectdeptno,dnamenorowsselectedfromdeptwhere*BOSTON*=all(selectnullfromdual)SQL>selectdeptno,dnamefromdeptwhereKall(selectnullfromdual);norowsselected一返回了null,1和mH1比較的結(jié)果是null(UNKNOWN)SQL>selectdeptno,dnamefromdeptwhereKal1(selectjobfromempwhere1=2);DEPTNODNAME—后面的子查詢返回為空10ACCOUNTING20RESEARCH30SALES40OPERATIONS第三節(jié)邏輯條件第四節(jié)成員關(guān)系條件第五節(jié)范圍條件第六節(jié)NULL條件第四章函數(shù)第一節(jié)單值函數(shù)單值函數(shù)在查詢中返回單個值,可被應(yīng)用到select,where子句,startwith以及connectby子句和having子句。1.數(shù)值型函數(shù)數(shù)值型函數(shù)輸入數(shù)字型參數(shù)并返回數(shù)值型的值。多數(shù)該類函數(shù)的返回值支持38位小數(shù)點,諸如:COS,COSH,EXP,LN,LOG,SIN,SINH,SQRT,TAN,andTANH支持36位小數(shù)點。ACOS,ASIN,ATAN,andATAN2支持30位小數(shù)點。下面是常用的數(shù)值型單值函數(shù).MOD返回n2除以nl的余數(shù),如果nl=0則返回n2的值。eg:14:18:53SQL>SELECTMOD(24,5)valueFROMDUAL;VALUE414:19:00SQL>SELECTMOD(24,0)valueFROMDUAL;VALUE24令ROUND它的作用是對數(shù)字number進行四舍五入,精確到哪個精度呢?由參數(shù)integer指定,如果integer是0表示精確到整數(shù),如果integer是負數(shù)表示精確到小數(shù)點左邊的第integer位,如果integer是正數(shù)表示精確到小數(shù)點右邊的第integer位,不指定integer相當于其等于零。啥也不用說了,請看下面幾個例子:SQL>selectround(1.232,2)nfromdual;N1.23SQL>selectround(1.238,2)nfromdual;N1.24SQL>selectround(1.23,0)nfromdual;N1SQL>selectround(123.25,-1)nfromdual;120SQL>selectround(128.25,-1)nfromdual;130SQL>selectround(1.23)nfromdual;-—這個是沒有指定精度的情況,相當于精度為0精度能不能是小數(shù)?能,oracle會對精度進行取整數(shù),然后進行運算:SQL>selectround(1.23,1.24)nfromdual;N1.2SQL>selectround(1.23,1.85)nfromdual;N1.2SQL>selectround(12.5,-1.2)nfromdual;N10SQL>selectround(12.5,-1.8)nfromdual;X10如果精度指定的值超過了數(shù)的范圍,會是什么樣子呢?請看:SQL>selectround(1.2,-3)nfromdual;N0SQL>selectround(1.2,3)nfromdual;N1.2OtruncTtrunc 它表示數(shù)字n1,以小數(shù)點為標準,截取n2位;n2為正表示截取小數(shù)部分,n2為負表示截取整數(shù)部分,n2為零表示在小數(shù)點出截取,默認n2為零。例如:14:25:30SQL>SELECTTRUNC(23.56),TRUNC(23.56,1),TRUNC(23.56,-1)FROMDUAL;TRUNC(23.56)TRUNC(23.56,1)TRUNC(23.56,-1)23 23.5 20下面是不太常用的數(shù)值型單值函數(shù)。?ABSabs::=返回一個數(shù)字的絕對值。eg:SQL>selectabs(-5)absolutevaluefromdual;ABSOLUTEVALUE5SQL>selectabs(-1/3)a_vfromdual;A_V.333333333令A(yù)COSacos::=ACOS返回所給數(shù)字的arccosine值,n必須要是-1到1之間,所返回值是在0到n(圓周率)之間的一個數(shù)字。eg:SQL>selectacos(-1)vfromdual;V3.14159265SQL>selectacos(1)vfromdual;0令A(yù)SINasin::=返回所給數(shù)字n的arcsine值。n必須要是-1到1之間,所返回值是在-R/2到n/2(圓周率)之間的一個弧度值。eg:SQL>selectasin(-l)afromdual;A-1.5707963SQL>selectasin(0)afromdualA0令A(yù)TANatan::=*ATAN功能描述:返回所給數(shù)字n的arctangent值。n是一個任何值,所返回值是在-TI/2到TI/2(圓周率)之間的一個弧度值。舉例:SQL>selectatan(50)afromdual;1.55079899《ATAN2功能描述:返回所給數(shù)字n和m的arctangent值。n是一個任何值,所返回值是在-H/2到H/2(圓周率)之間的一個弧度值。ATAN2(n,m)==ATAN2(n/m)舉例:SQL>selectatan(l)afromdual;.785398163SQL>selectatan2(0.5,0.5)afromdual;?785398163《BIN_TO_NUM令BITAND-^CEIL令COS。FLOOR令SIN令SINH令2.返回字符值的字符型函數(shù)該類函數(shù)返回與輸入類型相同的類型,其中:1、返回的CHAR類型值長度不超過2000字節(jié):2、返回的VCHAR2類型值長度不超過4000字節(jié);如果上述應(yīng)返回的字符長度超出,oracle并不會報錯而是直接截斷至最大可支持長度返回。3、返回的CLOB類型值長度不超過4G;對于CLOB類型的函數(shù),如果返回值長度超出,oracle不會返回任何錯誤而是直接拋出錯誤。下面是常用的返回字符值的字符型函數(shù)。。LOWER\LOWER|)(7))(char))(T)>將指定字符串內(nèi)字符變?yōu)樾?,支持CHAR,VARCHAR2,NCHAR,NVARCHAR2,CLOB,NCLOB類型。eg:14:35:48SQL>SELECTLOWER(^haTistHis')lowerFROMDUAL;LOWERwhatisthis令UPPER卜|UPPER將指定字符串內(nèi)字符變?yōu)榇髮懀С諧HAR,VARCHAR2,NCHAR,NVARCHAR2,CLOB,NCLOB類型。例如:14:35:54SQL〉SELECTUPPER('WhaTistHis')upperFROMDUAL;UPPERWHATISTHIS令LPADTLPAD返回指定長度=n的字符串,需要注意的有幾點:.如果n<exprl.length則從右到左截取指定長度返回;.如果n>exprl.lengthandexpr2isnull,以空格從左向右補充字符長度至n并返回;.如果n>exprl.lengthandexpr2isnotnull,以指定字符expr2從左向右補充exprl長度至n并返回。eg:14:39:27SQL>SELECTLPAD(*WhaTistHis',5)LPAD1,14:39:472 LPAD('WhaTistHis',25)LPAD2,14:39:473 LPAD(*WhaTistHis',25,'」)LPAD314:39:47 4FROMDUAL;LPAD1LPAD2 LPAD3WhaT WhaTistHis WhaTistHis最后大家再猜一猜,如果n<0,結(jié)果會怎么樣?14:41:15SQL>SELECTLPAD(*WHATISTHIS*,-5)LPADFROMDUAL;LPAD《RPAD返回指定長度=n的字符串,基本與LPAD含義相同,不過補充字符是從右向左方向正好與上相反。eg:14:42:18SQL>SELECTRPADCWhaTistHis*,5)RPAD1,14:43:59 2 RPADCWhaTistHis*,25)RPAD2,14:43:59 3 RPADCWhaTistHis',25,'」)RPAD314:43:59 4FROMDUAL;RPAD1RPAD2 RPAD3WhaTWhaTistHisWhaTistHisWhaTWhaTistHisWhaTistHis 令TRIMsource^Qj?source^Qj?看起來很復(fù)雜,理解起來很簡單:.如果沒有指定任何參數(shù)則oracle去除trim_source頭尾空格。eg:14:44:00SQL>SELECTTRIMCWhaTistHis')TRIMFROMDUAL;TRIMWhaTistHis.如果指定了trim_character參數(shù),則oracle去掉trim_source頭尾trim_characteroeg:14:49:58SQL>SELECTTRIMC*W*FROM*WhaTistHiswW*)trimFROMDUAL;TRIMhaTistHisw.如果指定了leading參數(shù)則會去掉trim_source頭部trim_characteroeg:14:51:58SQL>SELECTTRIM(leadingFROM*WhaTistHisw『)trimFROMDUAL;TRIMhaTistHiswW.如果指定了trailing參數(shù)則會去掉trimsource尾部trim_characteroeg:14:52:59SQL>SELECTTRIM(trailing'W'FROM*WhaTistHiswW')trimFROMDUAL;TRIMWhaTistHisw.如果指定了both參數(shù)則會去掉trim_source頭尾trim_character(跟不指定沒有區(qū)別)。eg:14:53:39SQL>SELECTTRIM(bothFROM*WhaTistHiswW*)trimFROMDUAL;TRIMhaTistHisw注意:c2長度=1令LTRIMTLTRIM從字符串char左側(cè)截取掉與指定字符串set相同的字符并返回,并且char的開頭部分必須要是set,否則不會截取,如果set為空則默認截取單空格。eg:14:56:38SQL〉SELECTLTRIMCWWhhhhhaTistHisw『,'W')ltrim2FROMDUAL;LTRIM2hhhhhaTistHiswW在其之前的所有的部分都公被截掉14:56:01SQL>SELECTLTRIMCWhhhhhaTistHisw『,'Wh')ItrimlFROMDUAL;LTRIM1aTistHiswW 在其之前的所仃的部分都會被截掉,在其之后的連續(xù)的與c2仃相同的字母全部被裁取,這里所有的h都被截取掉了。14:58:54SQL>SELECTLTRIMCWWhhhhhaTistHiswW','w')ltrim3FROMDUAL;LTRIM3WWhhhhhaTistHiswW -這里不是以■開頭,故失去截取功能令RTRIMJRTRIM J 與LTRIM含義類似,只不過方向相反。eg:14:56:44SQL>SELECTRTRIMCWhhhhhaTistHiswWTSOUNDEX返回字符串參數(shù)的語音表示形式,對于比較一些讀音相同,但是拼寫不同的單詞非常有用。計算語音的算法如下:?TSOUNDEX返回字符串參數(shù)的語音表示形式,對于比較一些讀音相同,但是拼寫不同的單詞非常有用。計算語音的算法如下:?保留字符串首字母,但刪除a、e、h、i、。、w、yo?將下表中的數(shù)字賦給相對應(yīng)的字母:1:b、f、p、v2:c、g>k、q>s>x、z3:d>t4:15:m>n6:R如果字符串中存在擁有相同數(shù)字的2個以上(包含2個)的字母在一起(例如b和f),或者只有h或W,則刪除其他的,只保留1個;?只返回前4個字節(jié),不夠用0填充eg:18:05:00SQL>SELECTSOUNDEXCdog')dog,soundexCboy')boyFROMDUAL:DOGBOYRTRIMWWhhhhhaTistHis令REPLACEtREPLACE)[^^Cepla8mentstringtREPLACE將char字符串中的searchstring替換為replace_string,如果replace_string為空,則從char中刪除所有search_stringoeg:15:06:16SQL>SELECTREPLACE(,WhhhhhaTistHisw replaceFROMDUAL;REPLACE——hhhhhaTistHisw-令SOUNDEXD200BOOO令SUBSTR截取指定長度的字符串,稍不注意就可能充滿了陷阱的函數(shù)。position是開始截取的位置,substringlength要截取的字符串長度,如果為空,默認截取到字符串結(jié)尾:如果position=0thenpositional18:19:49SQL>SELECTSUBSTRCWhatisthis',0,3)subFROMDUAL;SUBWha2、如果position>0,則oracle從左向右確認起始位置截取18:20:50SQL>SELECTSUBSTR(*Whatisthis',5,3)subFROMDUAL;SUBis3、如果position<0,則oracle從右向左數(shù)確認起始位置18:20:52SQL>SELECTSUBSTRCWhatisthis\-5,3)subFROMDUAL;SUBth4、如果position>char.length則返回空18:21:31SQL>SELECTSUBSTR(*Whatisthis',50,3)subFROMDUAL;S此處是nul)5、如果substring_length<l,則不截取18:24:10SQL>SELECTSUBSTRCWhatisthis',4,0)subFROMDUAL;S一此處是null18:24:25SQL〉SELECTSUBSTRCWhatisthis',4,T)subFROMDUAL;S--此處是null《TRANSLATETRANSLATE fromstringX^y^tostring)^)~?就功能而言,此函數(shù)與replace有些相似。但需要注意的一點是,translate是絕對匹配替換,這點與replace函數(shù)具有非常大區(qū)別。什么是絕對匹配替換呢?簡單的說,是將字符串expr中出現(xiàn)在格式from_string中的字符都 替換為to_stringo如:18:44:41SQL>SELECTtranslateCWhatisthis',' translateFROMDUAL;TRANSLATEWhat-Cs-thCs原字符串中空格被替換成,i被替換成Cr18:48:29SQL>selectreplace(*WTiatisthis','i','-')replacefromdual;REPLACEWhat-sthis 原字符串中連在一起的空格和i被「很顯然,上面這種情況是要求fromstring和to_string的字符的個數(shù)要對應(yīng),那么如果from_string中字符的個數(shù)如果比to_string中的個數(shù)要多的話,那么這些from_string后面多余的部分,如果它們出現(xiàn)在expr中,則會直接被移除。如:18:55:18SQL>SELECTtranslateCWhatisthis','is',',)translateFROMDUAL;TRANSLATEWhat-th--原字符串的字母s就被移除掉了,i被替換成-如果from_string的個數(shù)比to_string要少,那么to_string后面多余的字符串直接丟棄不管,如:18:55:33SQL>SELECTtranslateCWhatisthis',」','-*')translateFROMDUAL;TRANSLATEWhat-sth-s—很顯然,字符直接被丟棄。如果你想通過給to_string用一個空字符串,來達到清空expr的目的,這樣是不行的。oracle會把傳給to_string的空字符串當成是null,這樣傳入null,則直接輸出null,而非被移除所有字符的空字符串expr。如:18:56:44SQL>SELECTtranslateCWhatisthis',7','')translateFROMDUAL;T此處是null19:00:49SQL>SELECTtranslateCWhatisthis'i',null)translateFROMDUAL;T此處是null從上面的解釋,我們可以這樣理解replace和translate:replace是替換,而translate則像是過濾。下面是不太常見的返回字符值的字符型函數(shù)。令.返回數(shù)字值的字符型函數(shù)本類函數(shù)支持所有的數(shù)據(jù)類型.令I(lǐng)NSTRinstr::=這些"instringn函數(shù)的作用都是在string中查詢substring,函數(shù)返回一個整數(shù)來表示substring在string中從position位置計算開始出現(xiàn)第occurrence次的位置。INS

溫馨提示

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

評論

0/150

提交評論