Oracle常用函數

一、Oracle的函數

Oracle提供了很多函數用於數據的處理、統計和轉換,這些函數增強了SQL語言的功能。

Oracle的函數分爲單行函數、聚合函數和分析函數三大類。

1、單行函數

單行函數應用於SQL語句中時,只能輸入一個數據,返回一個結果,常用的單行函數包括字符串函數、數字函數、日期函數、轉換函數。

2、聚合函數

聚合函數應用於SQL語句中時,同時對多行數據進行操作,返回一個結果,例如求結果集的記錄數、最小值、最大值、平均值、統計值等。

3、分析函數

分析函數用於計算基於分組的某種聚合值,它和聚合函數的不同之處是對於每個組返回多行,而聚合函數對於每個組只返回一行。

分析函數的應用場景比較少,概念難以理解,本文就不介紹了。

二、字符串函數

字符串函數接受字符串參數,參數可以是表中的列名,也可以是字符串表達式或字符串常量。

1、ASCII碼轉換ascii和chr

ascii(str):返回字符串str第一個字符的ASCII碼值。

chr(ii):返回ASCII碼爲數字ii的字符。

在這裏插入圖片描述

2、字符串拼接concat

concat(str1,str2):把字符串str1和str2拼接成一個字符串,在實際應用中,我們更願意用||拼接字符串,因爲||可以拼接多個字符串。

在這裏插入圖片描述

3、字符串查找instr

instr(str1,str2,start,n):在字符串str1中查找str2。

start:從str1的哪個位置開始查找,可選參數,缺省爲1。如果start爲正數,從左到右查找,如果start爲負數,從右到左查找。

n表示要查找第幾次出現的str2,可選參數,缺省爲1,如果爲負數系統會報錯。

在這裏插入圖片描述

4、字符串的長度length

length (str):返回字符串str的長度。

在這裏插入圖片描述

5、字符串大小寫轉換lower和upper

lower (str):把字符串str轉換爲小寫,忽略不是字母的字符。

upper (str):把字符串str轉換爲大寫,忽略不是字母的字符。

在這裏插入圖片描述

6、截去字符串ltrim、rtrim和trim

ltrim(str1,str2):從字符串str1的左邊截去字符串str2,str2是可選參數,缺省爲空格。

rtrim(str1,str2):從字符串str1的右邊截去字符串str2,str2是可選參數,缺省爲空格。

trim(leading|trailing|both chr from str):從str中截去 左側|右側|兩側的chr字符,缺省是both(兩側),注意,chr是單個字符,不是字符串,缺省是空格。

在這裏插入圖片描述

7、字符串替換replace

replace(str,old,new):把字符串str中的old字符串替換成new字符串。

在這裏插入圖片描述

8、字符串截取substr

substr(str,start,len):從字符串str的start位置開始,截取len個字符,如果len不填就截取start之後全部的字符。

在這裏插入圖片描述

9、字符串補齊lpad的rpad

lpad(str,len,[chr]),從左邊補齊。

rpad(str,len,[chr]),從右邊補齊。

str:待補齊的原字符串。

len:最終返回的字符串的長度,如果最終返回的字符串的長度比源字符串的小,那麼此函數將對源串進行截斷處理。

chr:用於填充的字符,缺省爲空字符。

在這裏插入圖片描述

三、數字函數

數字函數接受數字參數,參數可以是表中的列名,也可以是數字表達式或數字常量。

函數 說明 示例
abs(x) x絕對值。 abs(-10)=10
cos(x) 餘弦。 cos(1)= 0.540302306
acos(x) x的反餘弦。 acos(1)=0
ceil(x) 大於或等於x的最小整數。 ceil(3.14)=4
floor(x) 小於或等於x的最大整數。 floor(3.14)=3
log(x,y) x爲底y的對數。 log(2,4)=2
mod(x,y) x除以y的餘數。 mod(7,3)=1
power(x,y) x的y次冪。 power(2,4)=16
round(x,y) x在第y小數位四捨五入。 round(3.1415,3)=3.142
sign(x) 判斷x的值,大於0返回1,等於0返回0,小於0返回-1。 sign(100)=1、sign(0)=0、sign(-100)=-1
sqrt(x) x的平方根。 sqrt(9)=3
trunc(x,y) x在第y位截斷。 trunc(3.14159,3)=3.141

補充說明:

1)round函數

round(x[,y]),四捨五入函數。

y的缺省值0,例如:round(3.14)=3、round(3.56)=4。

y是正整數,四捨五入到小數點後y位,例如:round(3.14159,3)=3.142。

y是負整數,四捨五入到小數點左邊y位,round(314.159,-2)=300。

2)trunc函數

trunc(x[,y]),直接截斷,不四捨五入。

y的缺省值0,例如:trunc(3.14)=3。

y是正整數,小數點y位後截斷,trunc(3.141592,3)=3.141。

y是負整數,小數點y位前截斷。trunc(314.159,-2)=300。

四、日期函數

Oracle的日期函數極其重要,在《Oracle日期函數》文章中有詳細的說明。

五、轉換函數

Oracle的數據類型轉換主要有三種:1)日期與字符串;2)rowid與字符串;3)數字與字符串。

1、日期和字符串之間的轉換

日期與字符串的轉換用to_date和to_char函數完成,在《Oracle日期函數》文章中有詳細的說明。

2、rowid和字符串之間的轉換

Oracle數據庫能隱式的在rowid和字符串之間的轉換。

3、數字和字符串之間的轉換

Oracle數據庫能隱式的在數字和字符串之間的轉換,但是要注意幾個問題:

1)任意數字都可以轉換成字符串。

在這裏插入圖片描述

2)只有包含了合法數字的字符串才能轉換爲數字,否則提示錯誤。

在這裏插入圖片描述
在這裏插入圖片描述

3)空字符串轉換爲數字後是null,不是0,這個特點太棒了。

在這裏插入圖片描述

還有,Oracle提供了to_number函數把字符串轉換爲數字,to_number支持多種格式,用法比較複雜,不建議使用。

六、其它的單行函數

1、nvl函數

NVL2(x,value)

如果x爲空,返回value,否則返回x。

示例,運行以下腳本生成測試數據:

create table tt(name varchar2(20),age number(3));
insert into tt values('西施',20);
insert into tt values('楊玉環',null);
insert into tt values(null,18);
select nvl(name,'匿名美女'),nvl(age,0) from tt;

在這裏插入圖片描述

2、decode函數

decode(條件,1,返回值1,2,返回值2,......,值n,返回值n,缺省值)

該函數的含義如下:

if (條件==1) return 返回值1;
else if (條件==2) return 返回值2;
else if (條件==3) return 返回值3;
  ......
else return 缺省值;

示例,運行以下腳本生成測試數據:

create table tt(name varchar2(20),yz number(1),sc number(1));
insert into tt values('西施',1,2);
insert into tt values('楊玉環',2,1);
insert into tt values('夏姬',3,3);
insert into tt values('芙蓉姐姐',4,4);
select name,decode(yz,1,'漂亮',2,'可愛',3,'狐媚','不合格'),decode(sc,1,'豐滿',2,'火辣',3,'苗條','不及格') from tt;

在這裏插入圖片描述

3、userenv函數

userenv(string),獲取當前用戶會話的信息。

string的取值如下:

isdba,如果用戶已經被認證爲DBA或者是通過操作系統或口令文件具有DBA特權的,返回TRUE,否則返回FALSE。

language,返回數據庫當前會話的語言、地域和字符集。

lang,返回ISO縮寫語言名稱,一個比現有的“語言”參數較短的形式。

sid ,返回數據庫會話ID。

terminal,返回當前會話的終端操作系統的標識符。在分佈式SQL語句,此參數返回了標識符爲本地會話。在分佈式環境中,此參數只支持遠程SELECT語句,不用於遠程INSERT,UPDATE或DELETE操作。

sessionid,返回審計會話標識符,在分佈式SQL語句不能指定此參數。

client_info,返回最高可達64個字節存儲的用戶會話信息,可由應用程序使用DBMS_APPLICATION_INFO包。

entryid,返回當前審計條目編號,審計的EntryID序列細粒度的審計記錄和定期審計記錄之間共享,在分佈式SQL語句不能使用這個屬性。

測試一下比較常用的幾個參數:

在這裏插入圖片描述

4、user函數

查看當前會話的用戶名。
在這裏插入圖片描述

七、聚合函數

聚合函數也叫分組函數或集合函數,它對多行記錄中的某個列執行計算並返回一個值。

聚合函數經常與 select 語句的 group
by 子句一同使用,所以有的時候也把它稱之爲分組函數。

1、分組函數

函數 說明 示例
min(x) 求最小值。 select min(sal) from EMP;
max(x) 求最大值。 select max(sal) from EMP;
avg(x) 求平均值。 select avg(sal) from EMP;
sum(x) 求合計值。 select sum(sal) from EMP;
count(*) 求記錄數。 select count(*) from EMP;
stddev(x) 求標準差。 select stddev(sal) from EMP;
variance(x) 求協方差。 select variance(sal) from EMP;
median(x) 求中位數。 select median(sal) from EMP;

stddev(x)、variance(x)、median(x)這三個函數極少使用。

2、空值處理

有一點需要注意的是,除了count函數,其它的分組函數均會忽略值爲null的列,這個特點極其重要,一定要記住它。

我們來測試一下,先生成測試數據:

create table tt(cc number(3));
insert into tt values(10);
insert into tt values(20);
insert into tt values(null);
select min(cc),max(cc),avg(cc),sum(cc),count(*) from tt;

在這裏插入圖片描述

注意,表中一共有三條數據,兩條非空記錄,一條空記錄,avg函數得到的結果是(10+20)/2=15,忽略了空值記錄,min、max、sum函數表面看不出來,但我們知道它們會忽略空值。

count函數不會忽略空值記錄,除非指定列名,例如:

在這裏插入圖片描述

3、group by子句

group by子句的意思就是按一定的規則進行分組,把數據集劃分成若干個子集,然後針對若干個子集進行數據統計,group by子句要與分組函數結合使用,否則沒有意義。

1)對全部的員工進行統計

select min(sal),max(sal),avg(sal),sum(sal),count(*) from EMP;

在這裏插入圖片描述

2)按部門分類(組)統計

select deptno,min(sal),max(sal),avg(sal),sum(sal),count(*) from EMP group by deptno;

在這裏插入圖片描述

在上面的示例中,select的字段列表中有deptno,那麼在group by後面一定也要有deptno,否則會出現語法錯誤。

select deptno,min(sal),max(sal),avg(sal),count(*) from EMP;

在這裏插入圖片描述

但是,在group by中有deptno,select的字段列表中可以沒有deptno,不會出現語法錯誤,但這種用法很少。

select min(sal),max(sal),avg(sal),sum(sal),count(*) from EMP group by deptno;

在這裏插入圖片描述

3)按部門和職位分類(組)統計

select deptno,job,avg(sal),count(*) from EMP group by deptno,job;

在這裏插入圖片描述

4)where子句一定要在group by子句之前,where子句中不能使用分組函數。

select deptno,avg(sal),count(*) from EMP where deptno in (20,30) group by deptno;

在這裏插入圖片描述

select deptno,avg(sal),count(*) from EMP group by deptno where deptno in (20,30);

在這裏插入圖片描述

select deptno,avg(sal),count(*) from EMP where avg(sal)>1000;

在這裏插入圖片描述

4、having子句

having 子句對 group by統計出來的結果進行篩選,語法與 where 類似,但 having可以包含分組函數。

1)先按部門分組統計

select deptno,avg(sal),count(*) from EMP group by deptno;

在這裏插入圖片描述

2)從統計結果中篩選人數>=5的記錄。

select deptno,avg(sal),count(*) from EMP group by deptno having count(*)>=5;

在這裏插入圖片描述

3)從統計結果中篩選平均公司超過兩千並且部門代碼等於20的記錄。

select deptno,avg(sal),count(*) from EMP group by deptno having avg(sal)>2000 and deptno=20;

在這裏插入圖片描述

八、應用經驗

本文介紹了Oracle常用的函數和用法,還有少部分的函數沒有介紹,並不是我偷懶,而是沒有必要。

數據庫提供函數的目的是爲了增強SQL語言的功能,但是我的看法有些不同,從一個程序員的視角,說說我的看法:

1)手工處理數據的時候,在SQL中使用函數確實可以擴展SQL的功能,我也經常這麼做;

2)不同數據庫提供的函數名、參數和功能有差異,從軟件項目的兼容性方面考慮,應用程序中能不用函數就不用函數。

3)在實際開發中,日期轉換函數(to_date和to_char)不得不用,但是,我在freecplus框架中已做了兼容性處理。

4)分組函數也得不用,包括min、max、avg、sum、count,幸運的是不同的數據庫基本上兼容,只是細節上也有點差別,不兼容功能的不建議使用。

所以,大家在學習函數的時候,瞭解一些常用的、不同數據庫能通用的函數即可,不要花太多的時間和精力去研究那些生闢和不通用的函數。

九、版權聲明

C語言技術網原創文章,轉載請說明文章的來源、作者和原文的鏈接。
來源:C語言技術網(www.freecplus.net)
作者:碼農有道

如果文章有錯別字,或者內容有錯誤,或其他的建議和意見,請您留言指正,非常感謝!!!

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