oracle日常函數彙總

第一篇 著名函數之單值函數

注:N表示數字型,C表示字符型,D表示日期型,[]表示內中參數可被忽略,fmt表示格式


數值類型函數

數值型函數輸入數字型參數並返回數值型的值。多數該類函數的返回值支持38位小數點,諸如:COS, COSH, EXP, LN, LOG, SIN, SINH, SQRT, TAN, and TANH 支持36位小數點。
ACOS, ASIN, ATAN, and ATAN2支持30位小數點。
1、MOD(n1,n2) 返回n1除n2的餘數,如果n2=0則返回n1的值。
例如:SELECT MOD(24,5) FROM DUAL;
2、ROUND(n1[,n2]) 返回四捨五入小數點右邊n2位後n1的值,n2缺省值爲0,如果n2爲負數就舍入到小數點左邊相應的位上(雖然oracle documents上提到n2的值必須爲整數,
事實上執行時此處的判斷並不嚴謹,即使n2爲非整數,它也會自動將n2取整後做處理,但是我文檔中其它提到必須爲整的地方需要特別注意,如果不爲整執行時會報錯的)。
例如:SELECT ROUND(23.56),ROUND(23.56,1),ROUND(23.56,-1) FROM DUAL;
3、TRUNC(n1[,n2] 返回截尾到n2位小數的n1的值,n2缺省設置爲0,當n2爲缺省設置時會將n1截尾爲整數,如果n2爲負值,就截尾在小數點左邊相應的位上。
例如:SELECT TRUNC(23.56),TRUNC(23.56,1),TRUNC(23.56,-1) FROM DUAL;


字符型函數返回字符值

  該類函數返回與輸入類型相同的類型。
?	返回的CHAR類型值長度不超過2000字節;
?	返回的VCHAR2類型值長度不超過4000字節;
如果上述應返回的字符長度超出,oracle並不會報錯而是直接截斷至最大可支持長度返回。

?	返回的CLOB類型值長度不超過4G;
對於CLOB類型的函數,如果返回值長度超出,oracle不會返回任何錯誤而是直接拋出錯誤。
1、LOWER(c) 將指定字符串內字符變爲小寫,支持CHAR,VARCHAR2,NCHAR,NVARCHAR2,CLOB,NCLOB類型
例如:SELECT LOWER('WhaT is tHis') FROM DUAL;
2、UPPER(c) 將指定字符串內字符變爲大寫,支持CHAR,VARCHAR2,NCHAR,NVARCHAR2,CLOB,NCLOB類型
例如:SELECT UPPER('WhaT is tHis') FROM DUAL;
3、LPAD(c1,n[,c2]) 返回指定長度=n的字符串,需要注意的有幾點:
?	如果n<c1.length則從右到左截取指定長度返回;
?	如果n>c1.length and c2 is null,以空格從左向右補充字符長度至n並返回;
?	如果n>c1.length and c2 is not null,以指定字符c2從左向右補充c1長度至n並返回;
例如:SELECT LPAD('WhaT is tHis',5),LPAD('WhaT is tHis',25),LPAD('WhaT is tHis',25,'-') FROM DUAL;
最後大家再猜一猜,如果n<0,結果會怎麼樣
4、RPAD(c1,n[,c2]) 返回指定長度=n的字符串,基本與上同,不過補充字符是從右向左方向正好與上相反;
例如:SELECT RPAD('WhaT is tHis',5),RPAD('WhaT is tHis',25),RPAD('WhaT is tHis',25,'-') FROM DUAL;
5、TRIM([[LEADING||TRAILING||BOTH] c2 FROM] c1)  哈哈,被俺無敵的形容方式搞暈頭了吧,這個地方還是看圖更明瞭一些。
 
看起來很複雜,理解起來很簡單:
?	如果沒有指定任何參數則oracle去除c1頭尾空格
例如:SELECT TRIM('   WhaT is tHis   ') FROM DUAL;
?	如果指定了c2參數,則oracle去掉c1頭尾c2(這個建議細緻測試,有多種不同情形的喲)
例如:SELECT TRIM('W' FROM 'WhaT is tHis w W') FROM DUAL;
?	如果指定了leading參數則會去掉c1頭部c2
例如:SELECT TRIM(leading 'W' FROM 'WhaT is tHis w W') FROM DUAL;
?	如果指定了trailing參數則會去掉c1尾部c2
例如:SELECT TRIM(trailing 'W' FROM 'WhaT is tHis w W') FROM DUAL;
?	如果指定了both參數則會去掉c1頭尾c2(跟不指定有區別嗎?沒區別!)
例如:SELECT TRIM(both 'W' FROM 'WhaT is tHis w W') FROM DUAL;

注意:c2長度=1
6、LTRIM(c1[,c2]) 千萬表以爲與上面那個長的像,功能也與上面的類似,本函數是從字符串c1左側截取掉與指定字符串c2相同的字符並返回。如果c2爲空則默認截取空格。
例如:SELECT LTRIM('WWhhhhhaT is tHis w W','Wh') FROM DUAL;
7、RTRIM(c1,c2)與上同,不過方向相反
例如:SELECT RTRIM('WWhhhhhaT is tHis w W','W w') FROM DUAL;
8、REPLACE(c1,c2[,c3]) 將c1字符串中的c2替換爲c3,如果c3爲空,則從c1中刪除所有c2。
例如:SELECT REPLACE('WWhhhhhaT is tHis w W','W','-') FROM DUAL;
9、SOUNDEX(c) 神奇的函數啊,該函數返回字符串參數的語音表示形式,對於比較一些讀音相同,但是拼寫不同的單詞非常有用。計算語音的算法如下:
?	保留字符串首字母,但刪除a、e、h、i、o、w、y。
?	將下表中的數字賦給相對應的字母:
1:b、f、p、v
2:c、g、k、q、s、x、z
3:d、t
4:l
5:m、n
6:R
?	如果字符串中存在擁有相同數字的2個以上(包含2個)的字母在一起(例如b和f),或者只有h或w,則刪除其他的,只保留1個;
?	只返回前4個字節,不夠用0填充
例如:SELECT SOUNDEX('dog'),soundex('boy') FROM DUAL;
10、SUBSTR(c1,n1[,n2]) 截取指定長度的字符串。稍不注意就可能充滿了陷阱的函數。
n1=開始長度;
n2=截取的字符串長度,如果爲空,默認截取到字符串結尾;
?	如果n1=0 then n1=1
?	如果n1>0,則oracle從左向右確認起始位置截取
例如:SELECT SUBSTR('What is this',5,3) FROM DUAL;
?	如果n1<0,則oracle從右向左數確認起始位置
例如:SELECT SUBSTR('What is this',-5,3) FROM DUAL;
?	如果n1>c1.length則返回空
例如:SELECT SUBSTR('What is this',50,3) FROM DUAL;
然後再請你猜猜,如果n2<1,會如何返回值呢

11、TRANSLATE(c1,c2,c3) 就功能而言,此函數與replace有些相似。但需要注意的一點是,translate是絕對匹配替換,這點與replace函數具有非常大區別。
什麼是絕對匹配替換呢?簡單的說,是將字符串c1中按一定的格式c2替換爲c3。如果文字形容仍然無法理解,我們通過幾具實例來說明:
例如:
SELECT TRANSLATE('What is this','','-') FROM DUAL;
SELECT TRANSLATE('What is this','-','') FROM DUAL;
結果都是空。來試試這個:
SELECT TRANSLATE('What is this',' ',' ') FROM DUAL;
再來看這個:
SELECT TRANSLATE('What is this','ait','-*') FROM DUAL;
是否明白了點呢?Replace函數理解比較簡單,它是將字符串中指定字符替換成其它字符,它的字符必須是連續的。而translate中,則是指定字符串c1中出現的c2,
將c2中各個字符替換成c3中位置順序與其相同的c3中的字符。明白了?Replace是替換,而translate則像是過濾。

===字符型函數返回字符值===

<pre>
本類函數支持所有的數據類型
1、INSTR(c1,c2[,n1[,n2]]) 返回c2在c1中位置
?	c1:原字符串
?	c2:要尋找的字符串
?	n1:查詢起始位置,正值表示從左到右,負值表示從右到左 (大小表示位置,比如3表示左面第3處開始,-3表示右面第3處開始)。黑黑,如果爲0的話,則返回的也是0
?	n2:第幾個匹配項。大於0
例如:SELECT INSTR('abcdefg','e',-3) FROM DUAL;
2、LENGTH(c) 返回指定字符串的長度。如果
例如:SELECT LENGTH('A123中') FROM DUAL;
猜猜SELECT LENGTH('') FROM DUAL;的返回值是什麼


日期函數

本類函數中,除months_between返回數值外,其它都將返回日期。
1、ADD_MONTHS() 返回指定日期月份+n之後的值,n可以爲任何整數。
例如:SELECT ADD_MONTHS(sysdate,12),ADD_MONTHS(sysdate,-12) FROM DUAL;
2、CURRENT_DATE 返回當前session所在時區的默認時間
例如:
SQL> alter session set nls_date_format = 'mm-dd-yyyy' ;
SQL> select current_date from dual;
3、SYSDATE 功能與上相同,返回當前session所在時區的默認時間。但是需要注意的一點是,如果同時使用sysdate與current_date獲得的時間不一定相同,
某些情況下current_date會比sysdate快一秒。經過與xyf_tck(兄臺的大作ORACLE的工作機制寫的很好,深入淺出)的短暫交流,我們認爲current_date是將
current_timestamp中毫秒四捨五入後的返回,雖然沒有找到文檔支持,但是想來應該八九不離十。同時,僅是某些情況下會有一秒的誤差,一般情況下並
不會對你的操作造成影響,所以瞭解即可。
例如:SELECT SYSDATE,CURRENT_DATE FROM DUAL;
4、LAST_DAY(d) 返回指定時間所在月的最後一天
例如:SELECT last_day(SYSDATE) FROM DUAL;
5、NEXT_DAY(d,n) 返回指定日期後第一個n的日期,n爲一週中的某一天。但是,需要注意的是n如果爲字符的話,它的星期形式需要與當前session默認時區中的星期形式相同。
例如:三思用的中文nt,nls_language值爲SIMPLIFIED CHINESE
SELECT NEXT_DAY(SYSDATE,5) FROM DUAL;
SELECT NEXT_DAY(SYSDATE,'星期四') FROM DUAL;
兩種方式都可以取到正確的返回,但是:
SELECT NEXT_DAY(SYSDATE,'Thursday') FROM DUAL;
則會執行出錯,提供你說週中的日無效,就是這個原因了。
6、MONTHS_BETWEEN(d1,d2) 返回d1與d2間的月份差,視d1,d2的值大小,結果可正可負,當然也有可能爲0
例如:
SELECT months_between(SYSDATE, sysdate),
       months_between(SYSDATE, add_months(sysdate, -1)),
       months_between(SYSDATE, add_months(sysdate, 1))
  FROM DUAL;
7、ROUND(d[,fmt]) 前面講數值型函數的時候介紹過ROUND,此處與上功能基本相似,不過此處操作的是日期。如果不指定fmt參數,則默認返回距離指定日期最近的日期。
例如:SELECT ROUND(SYSDATE,'HH24') FROM DUAL;
8、TRUNC(d[,fmt]) 與前面介紹的數值型TRUNC原理相同,不過此處也是操作的日期型。
例如:SELECT TRUNC(SYSDATE,'HH24') FROM DUAL;

轉換函數

轉換函數將指定字符從一種類型轉換爲另一種,通常這類函數遵循如下慣例:函數名稱後面跟着待轉換類型以及輸出類型。
1、TO_CHAR() 本函數又可以分三小類,分別是
?	轉換字符->字符TO_CHAR(c):將nchar,nvarchar2,clob,nclob類型轉換爲char類型;
例如:SELECT TO_CHAR('AABBCC') FROM DUAL;

?	轉換時間->字符TO_CHAR(d[,fmt]):將指定的時間(data,timestamp,timestamp with time zone)按照指定格式轉換爲varchar2類型;
例如:SELECT TO_CHAR(sysdate,'yyyy-mm-dd hh24:mi:ss') FROM DUAL;

?	轉換數值->字符TO_CHAR(n[,fmt]):將指定數值n按照指定格式fmt轉換爲varchar2類型並返回;
例如:SELECT TO_CHAR(-100, 'L99G999D99MI') FROM DUAL;
2、TO_DATE(c[,fmt[,nls]]) 將char,nchar,varchar2,nvarchar2轉換爲日期類型,如果fmt參數不爲空,則按照fmt中指定格式進行轉換。注意這裏的fmt參數。
如果ftm爲'J'則表示按照公元制(Julian day)轉換,c則必須爲大於0並小於5373484的正整數。
例如:
SELECT TO_DATE(2454336, 'J') FROM DUAL;
SELECT TO_DATE('2007-8-23 23:25:00', 'yyyy-mm-dd hh24:mi:ss') FROM DUAL;
3、TO_NUMBER(c[,fmt[,nls]]) 將char,nchar,varchar2,nvarchar2型字串按照fmt中指定格式轉換爲數值類型並返回。
例如:SELECT TO_NUMBER('-100.00', '9G999D99') FROM DUAL;


其它輔助函數

1、DECODE(exp,s1,r1,s2,r2..s,r[,def]) 可以把它理解成一個增強型的if else,只不過它並不通過多行語句,而是在一個函數內實現if else的功能。
exp做爲初始參數。s做爲對比值,相同則返回r,如果s有多個,則持續遍歷所有s,直到某個條件爲真爲止,否則返回默認值def(如果指定了的話),如果沒有默認值,
並且前面的對比也都沒有爲真,則返回空。
毫無疑問,decode是個非常重要的函數,在實現行轉列等功能時都會用到,需要牢記和熟練使用。

例如:select decode('a2','a1','true1','a2','true2','default') from dual;
2、GREATEST(n1,n2,...n)  返回序列中的最大值
例如:SELECT GREATEST(15,5,75,8) "Greatest" FROM DUAL;
3、LEAST(n1,n2....n)   返回序列中的最小值
例如:SELECT LEAST(15,5,75,8) LEAST FROM DUAL;
4、NULLIF(c1,c2) 
Nullif也是個很有意思的函數。邏輯等價於:CASE WHEN c1 = c2 THEN NULL ELSE c1 END
例如:SELECT NULLIF('a','b'),NULLIF('a','a') FROM DUAL;
5、NVL(c1,c2) 邏輯等價於IF c1 is null THEN c2 ELSE c1 END。c1,c2可以是任何類型。如果兩者類型不同,則oracle會自動將c2轉換爲c1的類型。
例如:SELECT NVL(null, '12') FROM DUAL;
6、NVL2(c1,c2,c3)  大家可能都用到nvl,但你用過nvl2嗎?如果c1非空則返回c2,如果c1爲空則返回c3
例如:select nvl2('a', 'b', 'c') isNull,nvl2(null, 'b', 'c') isNotNull from dual;
7、SYS_CONNECT_BY_PATH(col,c)  該函數只能應用於樹狀查詢。返回通過c1連接的從根到節點的路徑。該函數必須與connect by 子句共同使用。
例如:
create table tmp3(
rootcol varchar2(10),
nodecol varchar2(10)
);

insert into tmp3 values ('','a001');
insert into tmp3 values ('','b001');
insert into tmp3 values ('a001','a002');
insert into tmp3 values ('a002','a004');
insert into tmp3 values ('a001','a003');
insert into tmp3 values ('a003','a005');
insert into tmp3 values ('a005','a008');
insert into tmp3 values ('b001','b003');
insert into tmp3 values ('b003','b005');

select lpad(' ', level*10,'=') ||'>'|| sys_connect_by_path(nodecol,'/')
  from tmp3
 start with rootcol = 'a001'
connect by prior nodecol =rootcol;
8、SYS_CONTEXT(c1,c2[,n]) 將指定命名空間c1的指定參數c2的值按照指定長度n截取後返回。
Oracle9i提供內置了一個命名空間USERENV,描述了當前session的各項信息,其擁有下列參數:
?	CURRENT_SCHEMA:當前模式名;
?	CURRENT_USER:當前用戶;
?	IP_ADDRESS:當前客戶端IP地址;
?	OS_USER:當前客戶端操作系統用戶;
等等數十項,更詳細的參數列還請大家直接參考Oracle Online Documents

例如:SELECT SYS_CONTEXT('USERENV', 'SESSION_USER') FROM DUAL;


第二篇 非著名函數之單值函數


數值型函數

數值型函數輸入數字型參數並返回數值型的值。多數該類函數的返回值支持38位小數點,諸如:
COS, COSH, EXP, LN, LOG, SIN, SINH, SQRT, TAN, and TANH 支持36位小數點。ACOS, ASIN, ATAN, and ATAN2支持30位小數點。
1、ABS(n) 返回數字的絕對值
例如:SELECT ABS(-1000000.01) FROM DUAL;
2、COS(n) 返回n的餘弦值
例如:SELECT COS(-2) FROM DUAL;
3、ACOS(n) 反餘弦函數,n between -1 and 1,返回值between 0 and pi。
例如:SELECT ACOS(0.9) FROM DUAL;
4、BITAND(n1,n2) 位與運算,這個太有意思了,雖然沒想到可能用到哪裏,詳細說明一下:
假設3,9做位與運算,3的二進制形式爲:0011,9的二進制形式爲:1001,則結果是0001,轉換成10進制數爲1。
例如:SELECT BITAND(3,9) FROM DUAL;
5、CEIL(n)  返回大於或等於n的最小的整數值
例如:SELECT ceil(18.2) FROM DUAL;
考你一下,猜猜ceil(-18.2)的值會是什麼呢
6、FLOOR(n) 返回小於等於n的最大整數值
例如:SELECT FLOOR(2.2) FROM DUAL;
再猜猜floor(-2.2)的值會是什麼呢
7、BIN_TO_NUM(n1,n2,....n)  二進制轉向十進制
例如:SELECT BIN_TO_NUM(1),BIN_TO_NUM(1,0),BIN_TO_NUM(1,1) FROM DUAL;
8、SIN(n) 返回n的正玄值,n爲弧度。
例如:SELECT SIN(10) FROM DUAL;
9、SINH(n) 返回n的雙曲正玄值,n爲弧度。
例如:SELECT SINH(10) FROM DUAL;
10、ASIN(n) 反正玄函數,n between -1 and 1,返回值between pi/2 and -pi/2。
例如:SELECT ASIN(0.8) FROM DUAL;
11、TAN(n) 返回n的正切值,n爲弧度
例如:SELECT TAN(0.8) FROM DUAL;
12、TANH(n) 返回n的雙曲正切值,n爲弧度
例如:SELECT TANH(0.8) FROM DUAL;
13、ATAN(n) 反正切函數,n表示弧度,返回值between pi/2 and -pi/2。
例如:SELECT ATAN(-444444.9999999) FROM DUAL;
14、EXP(n) 返回e的n次冪,e = 2.71828183 ...
例如:SELECT EXP(3) FROM DUAL;
15、LN(n) 返回n的自然對數,n>0
例如:SELECT LN(0.9) FROM DUAL;
16、LOG(n1,n2) 返回以n1爲底n2的對數,n1 >0 and not 1 ,n2>0
例如:SELECT LOG(1.1,2.2) FROM DUAL;
17、POWER(n1,n2) 返回n1的n2次方。n1,n2可以爲任意數值,不過如果m是負數,則n必須爲整數
例如:SELECT POWER(2.2,2.2) FROM DUAL;
18、SIGN(n) 如果n<0返回-1,如果n>0返回1,如果n=0返回0.
例如:SELECT SIGN(14),SIGN(-14),SIGN(0) FROM DUAL;
19、SQRT(n) 返回n的平方根,n爲弧度。n>=0
例如:SELECT SQRT(0.1) FROM DUAL;


字符型函數返回字符值

  
該類函數返回與輸入類型相同的類型。
返回的CHAR類型值長度不超過2000字節;
返回的VCHAR2類型值長度不超過4000字節;
如果上述應返回的字符長度超出,oracle並不會報錯而是直接截斷至最大可支持長度返回。
返回的CLOB類型值長度不超過4G;
對於CLOB類型的函數,如果返回值長度超出,oracle不會返回任何錯誤而是直接拋出錯誤。
1、CHR(N[ USING NCHAR_CS]) 返回指定數值在當前字符集中對應的字符
例如:SELECT CHR(95) FROM DUAL;
2、CONCAT(c1,c2) 連接字符串,等同於||
例如:SELECT concat('aa','bb') FROM DUAL;
3、INITCAP(c)   將字符串中單詞的第一個字母轉換爲大寫,其它則轉換爲小寫
例如:SELECT INITCAP('whaT is this') FROM DUAL;
4、NLS_INITCAP(c)  返回指定字符串,並將字符串中第一個字母變大寫,其它字母變小寫
例如:SELECT NLS_INITCAP('中華miNZHu') FROM DUAL;
它還具有一個參數:Nlsparam用來指定排序規則,可以忽略,默認狀態該參數爲當前session的排序規則。


字符型函數返回數字值

本類函數支持所有的數據類型
4、ASCII(c) 與chr函數的用途剛剛相反,本函數返回指定字符在當前字符集下對應的數值。
例如:SELECT ASCII('_') FROM DUAL;

===日期函數===
本類函數中,除months_between返回數值外,其它都將返回日期。
1、CURRENT_TIMESTAMP([n]) 返回當前session所在時區的日期和時間。n表示毫秒級的精度,不大於6
例如:SELECT CURRENT_TIMESTAMP(3) FROM DUAL;
2、LOCALTIMESTAMP([n]) 與上同,返回當前session所在時區的日期和時間。n表示毫秒級的精度,不大於6
例如:SELECT LOCALTIMESTAMP(3) FROM DUAL;
3、SYSTIMESTAMP([n]) 與上同,返回當前數據庫所在時區的日期和時間,n表示毫秒級的精度,>0 and <6
例如:SELECT SYSTIMESTAMP(4) FROM DUAL;
4、DBTIMEZONE 返回數據庫的當前時區
例如:SELECT DBTIMEZONE FROM DUAL;
5、SESSIONTIMEZONE 返回當前session所在時區
例如:SELECT SESSIONTIMEZONE FROM DUAL;
6、EXTRACT(key from date)  key=(year,month,day,hour,minute,second)  從指定時間提到指定日期列
例如:SELECT EXTRACT(year from sysdate) FROM DUAL;
7、TO_TIMESTAMP(c1[,fmt]) 將指定字符按指定格式轉換爲timestamp格式。
例如:SELECT TO_TIMESTAMP('2007-8-22', 'YYYY-MM-DD HH:MI:SS') FROM DUAL;


轉換函數

轉換函數將指定字符從一種類型轉換爲另一種,通常這類函數遵循如下慣例:函數名稱後面跟着待轉換類型以及輸出類型。
BIN_TO_NUM(n1,n2...n) 將一組位向量轉換爲等價的十進制形式。
例如:SELECT BIN_TO_NUM(1,1,0) FROM DUAL;

CAST(c as newtype) 將指定字串轉換爲指定類型,基本只對字符類型有效,比如char,number,date,rowid等。此類轉換有一個專門的表列明瞭哪種類型可以轉換爲哪種類型,此處就不作酹述。
例如:SELECT CAST('1101' AS NUMBER(5)) FROM DUAL;

CHARTOROWID(c)  將字符串轉換爲rowid類型
例如:SELECT CHARTOROWID('A003D1ABBEFAABSAA0') FROM DUAL;

ROWIDTOCHAR(rowid) 轉換rowid值爲varchar2類型。返回串長度爲18個字節。
例如:SELECT ROWIDTOCHAR(rowid) FROM DUAL;

TO_MULTI_BYTE(c) 將指定字符轉換爲全角並返回char類型字串
例如:SELECT TO_MULTI_BYTE('ABC abc 中華') FROM DUAL;

TO_SINGLE_BYTE(c) 將指定字符轉換爲半角並返回char類型字串
例如:SELECT TO_SINGLE_BYTE('ABC abc中華') FROM DUAL;


其它輔助函數

1、COALESCE(n1,n2,....n)   返回序列中的第一個非空值
例如:SELECT COALESCE(null,5,6,null,9) FROM DUAL;
2、DUMP(exp[,fmt[,start[,length]]])
dump是個功能非常強悍的函數,對於深入瞭解oracle存儲的人而言相當有用。所以對於我們這些僅僅只是應用的人而言就不知道能將其應用於何處了。此處僅介紹用法,不對其功能做深入分析。
如上所示,dump擁有不少參數。其本質是以指定格式,返回指定長度的exp的內部表示形式的varchar2值。fmt含4種格式:8||10||16||17,分別表示8進制,10進制,16進制和單字符,默認爲10進制。start參數表示開始位置,length表示以,分隔的字串數。
例如:SELECT DUMP('abcdefg',17,2,4) FROM DUAL;
3、EMPTY_BLOB,EMPTY_CLOB 這兩個函數都是返回空lob類型,通常被用於insert和update等語句以初始化lob列,或者將其置爲空。EMPTY表示LOB已經被初始化,只不過還沒有用來存儲數據。
4、NLS_CHARSET_NAME(n) 返回指定數值對應的字符集名稱。
例如:SELECT NLS_CHARSET_NAME(1) FROM DUAL;
5、NLS_CHARSET_ID(c) 返回指定字符對應的字符集id。
例如:SELECT NLS_CHARSET_ID('US7ASCII') FROM DUAL;
6、NLS_CHARSET_DECL_LEN(n1,n2) 返回一個NCHAR值的聲明寬度(以字符爲單位).n1是該值以字節爲單位的長度,n2是該值的字符集ID
例如:SELECT NLS_CHARSET_DECL_LEN(100, nls_charset_id('US7ASCII')) FROM DUAL;
7、SYS_EXTRACT_UTC(timestamp) 返回標準通用時間即格林威治時間。
例如:SELECT SYS_EXTRACT_UTC(current_timestamp) FROM DUAL;
8、SYS_TYPEID(object_type) 返回對象類型對應的id。
例如:這個這個,沒有建立過自定義對象,咋做示例?
9、UID 返回一個唯一標識當前數據庫用戶的整數。
例如:SELECT UID FROM DUAL;
10、USER 返回當前session用戶
例如:SELECT USER FROM DUAL;
11、USERENV(c) 該函數用來返回當前session的信息,據oracle文檔的說明,userenv是爲了保持向下兼容的遺留函數。oracle公司推薦你使用sys_context函數調用USERENV命名空間來獲取相關信息,所以大家瞭解下就行了。
例如:SELECT USERENV('LANGUAGE') FROM DUAL;
12、VSIZE(c) 返回c的字節數。
例如:SELECT VSIZE('abc中華') FROM DUAL;


第三篇 著名函數之聚合函數

聚合函數可被用於select,order by以及having子句中。其運算可以基於group by的結果,也可以直接對所有記錄進行運算。
當然,這種類型語句相信大家平常也用的比較多,概念性的就不多介紹了,有一點需要注意的是,除了count和grouping之後,
其它的統計運算均會忽略值爲null的列。
  爲更好演示此類函數應用,我們需要首先構建一個測試表,如下:

create table tmp1(col varchar2(10),value number(5));
insert into tmp1 values ('test1',60);
insert into tmp1 values ('test2',120);
insert into tmp1 values ('test3',460);
insert into tmp1 values ('test4',225);
insert into tmp1 values ('test5',119);
insert into tmp1 values ('test6',350);
insert into tmp1 values ('test7',23);
insert into tmp1 values ('test1',120);
insert into tmp1 values ('test3',69);
insert into tmp1 values ('test4',89);
insert into tmp1 values ('test6',145);

後續章節示例中也均以此表做例。
注意,多數聚合函數都支持DISTINCT子句(distinct是什麼?過濾記錄集中重複記錄用的),如果不指定則默認針對所有計錄,
舉個最簡單的例子:select count(col),count(distinct col) from tmp1。
本類函數中部分函數同時也屬於分析函數。其做爲分析函數時的具體用法將會在後面章節介紹,本節不做描述。
1、AVG([distinct|all]n) 求取記錄集中的平均值。
例如:SELECT col, avg(value) FROM tmp1 GROUP BY col ORDER BY col
2、COUNT([distinct|all]col) 該函數返回查詢涉及到的記錄行數。
例如:
SELECT col, count(0) FROM tmp1 GROUP BY col ORDER BY col;
SELECT count(col), count(distinct col) FROM tmp1;
3、DENSE_RANK(n1[,n2]...) WITHIN GROUP (ORDER BY col1 [desc|asc] [nulls first|last] [,col2 [desc|asc] [nulls first|last]]...) 
計算指定值在記錄集中的排序值。函數的參值必須一一對應group中的列,並且二者數據類型應該一致。至於order by子句中的nulls first|last
則是用來設置記錄集中值爲null的列的排序在前或在後。
例如:計算數值100在記錄集中的排序值。
SELECT dense_rank(100) within group( order by value) FROM tmp1
4、RANK() 參數及形式完全與上同,二區最大的區別是:RANK函數在處理指定數值在記錄集中的排序值時,如果值有重複,則後面的排序值會跳過這個值,
直接從當前排序值+重複記錄數開始,而DENSE_RANK則不會,排序值依然是個連續的序列。提到這個,在後面講分析函數講到row_number()時大家會又發現
不同,先刨個坑,後面再填。
例如:
	insert into tmp1 values ('test2',120);
SELECT dense_rank(121) within group( order by value) FROM tmp1;
SELECT rank(121) within group( order by value) FROM tmp1;
5、FIRST() 此函數格式描述看起來極複雜無比,其實也確實複雜無比。其本質是從DENSE_RANK返回的集合中取出排在第一的行(可能多行,因爲值可能相等),
因此完整的語法需要在開始處加上一個集合函數以從中取出記錄,功能與FIRST_VALUE相同。
 
例如:
SELECT col,
       MIN(value) KEEP(DENSE_RANK FIRST ORDER BY col) "Min Value",
       MAX(value) KEEP(DENSE_RANK LAST ORDER BY col) "Max Value"
  FROM tmp1
 GROUP BY col
6、LAST 形式參數等均與上同,不過就是把FIRST換成LAST即可。FIRST是取第一行,LAST則是取最後一行。
例如:
7、MAX([distinct|all] col) 取同組序列數據集中最大值。
例如:
SELECT col, MAX(value) "Max Value", MIN(value) "Min Value"
  FROM tmp1
 GROUP BY col
8、MIN([distinct|all] col) 取同組序列數據集中最小值。形式參數均與上同,不詳述
例如:
SELECT col, MAX(value) "Max Value", MIN(value) "Min Value"
  FROM tmp1
 GROUP BY col
9、SUM([distinct|all] col) 取指定列所在分組序列的值的和並返回。
例如:SELECT col, SUM(value) "Sum Value" FROM tmp1 GROUP BY col
10、GROUPING(col) cube、rollup子句的輔助函數,並且必須配合cube或rollup才能使用。用來確定當前記錄行是否是由cube或rollup生成,
如果是則返回1,不則返回0。
例如:
SELECT col, sum(value), grouping(value)
  FROM tmp1
 GROUP BY rollup(col, value)


第四篇 非著名函數之聚合函數

  聚合函數可被用於select,order by以及having子句中。其運算可以基於group by的結果,也可以直接對所有記錄進行運算。當然,這種類型語句相信大家平常也用的比較多,概念性的就不多介紹了,有一點需要注意的是,除了count和grouping之後,其它的統計運算均會忽略值爲null的列。

  注意,多數聚合函數都支持DISTINCT子句(distinct是什麼?過濾記錄集中重複記錄用的),如果不指定則默認針對所有計錄,舉個最簡單的例子:select count(col),count(distinct col) from tmp1。
  本類函數中部分函數同時也屬於分析函數。其做爲分析函數時的具體用法將會在後面章節介紹,本節不做描述。

CUME_DIST(expr[,expr]...) WITHIN GROUP
  (ORDER BY 
    expr [DESC | ASC] [NULLS {FIRST | LAST}] 
      [,expr [DESC | ASC] [NULLS {FIRST | LAST}]]...)非常有意思的一個函數。查詢指定數值在指定分組序列中的相對位置,返回值是介於 0 和 1 之間的小數值。我們後面還會再講幾個相關的函數,均是實現類型功能,只是值的表現形式不同。
例如:SELECT CUME_DIST(120) WITHIN GROUP (ORDER BY value) FROM TMP1
GROUP_ID() 該函數必須配合group by子句使用。主要是用來區分group by 生成的記錄集中是否是被重複生成的記錄,如果該條記錄是則返回1,否則返回0。
例如:SELECT t.col, group_id() FROM TMP1 t GROUP BY col, ROLLUP(col)
PERCENT_RANK ( expr [, expr]... ) WITHIN GROUP
( ORDER BY 
  expr [ DESC | ASC ] [NULLS { FIRST | LAST }]
  [, expr [ DESC | ASC ] [NULLS { FIRST | LAST }]]...)本函數語法及形式與cume_dist非常相似,也是返回指定數據在指定分組序列中所佔的相對位置,不過與cume_dist不同的是。不管指定值與分組序列中某值是否重複,均將此值視爲序列一部分,而cume_dist則不同。如果指定值與分組序列中某值重複,則將二值視爲一個值處理(上帝保佑,但願俺講明白了,廢話不說,大家通過示例來理解吧)。
例如:SELECT PERCENT_RANK(120) WITHIN GROUP( ORDER BY value) FROM TMP1
PERCENTILE_CONT(n) WITHIN GROUP (ORDER BY col [DESC|ASC]) 根據輸入值返回該值對應的分組序列中數值。輸入值應該是介於0到1之間。原因請參照前面的PERCENT_RANK函數。
如果分組序列中沒有存在對應值的話,會根據如下規則來計算返回值:
  if (CRN = FRN = RN) then 
    (value of expression from row at RN)
  else
    (CRN - RN) * (value of expression for row at FRN) +
    (RN - FRN) * (value of expression for row at CRN)

例如:
SELECT col, max(value), min(value), sum(value),
 PERCENTILE_CONT(0.5) WITHIN GROUP(ORDER BY value) a,
 PERCENTILE_CONT(0.8) WITHIN GROUP(ORDER BY value) b
  FROM TMP1
 group by col;
PERCENTILE_DISC(n) WITHIN GROUP (ORDER BY col [DESC|ASC]) 語法與形式與上例相同,不過在計算方法上略有差異。如果分組序列中沒有對應值的話,那麼將會返回該序列中最近最大的一個值。

相對而言,我認爲某些情況下本函數被應用的機率還是相當大地,起碼比上述幾個函數的應用範圍會廣。

例如:
SELECT col, max(value), min(value),
 PERCENTILE_DISC(0.5) WITHIN GROUP(ORDER BY value) a,
 PERCENTILE_DISC(0.8) WITHIN GROUP(ORDER BY value) b
  FROM TMP1
 group by col;
STDDEV([DISTINCT|ALL] n) 該函數返回樣本的標準偏差。
例如:SELECT col, STDDEV(value) FROM TMP1 GROUP BY col;
STDDEV_SAMP(n) 語法與形式與上同,其與STDDEV函數最大的區別是,如果該分組序列只有一行的話,則STDDEV_SAMP函數返回空值,而STDDEV則返回0。
例如:SELECT col, STDDEV(value),STDDEV_SAMP(value) FROM TMP1 GROUP BY col;
STDDEV_POP(n) 返回該分組序列總體標準偏差。
例如:SELECT col, STDDEV_POP(value) FROM TMP1 GROUP BY col;
VAR_POP(n) 該函數返回分組序列的總體方差,VAR_POP進行如下計算:(SUM(expr2) - SUM(expr)2 / COUNT(expr)) / COUNT(expr)。
例如:SELECT col, VAR_POP(value) FROM TMP1 GROUP BY col;
VAR_SAMP(n) 與上類似,該函數返回分組序列的樣本方差,,其計算公式爲:(SUM(expr2) - SUM(expr)2 / COUNT(expr)) / (COUNT(expr) - 1)。
例如:SELECT col, VAR_POP(value),VAR_SAMP(value) FROM TMP1 GROUP BY col;
VARIANCE(n) 該函數返回分組序列方差,Oracle計算該變量如下:
如果表達式中行數爲1,則返回0,如果表達式中行數大於1,則返回VAR_SAMP
例如:SELECT col, VAR_SAMP(value),VARIANCE(value) FROM TMP1 GROUP BY col;


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章