天天看點

Oracle——函數(單行函數、分組函數、分析函數)

oracle sql 提供了用于執行特定操作的專用函數。這些函數大大增強了 sql 語言的功能。

sql函數的分類:

Oracle——函數(單行函數、分組函數、分析函數)

對每一個函數應用在表的記錄中時,隻能輸入一行結果,傳回一個結果,可以出現在 select 子句中和 where 子句中

比如:mod(x,y)傳回 x 除以 y 的餘數(x 和 y 可以是兩個整數,也可以是表中的整

數列)。常用的單行函數有:

Ø  字元函數:對字元串操作。

Ø  數字函數:對數字進行計算,傳回一個數字。

Ø  轉換函數:可以将一種資料類型轉換為另外一種資料類型。

Ø  日期函數:對日期和時間進行處理。

2.  聚合函數:聚合函數同時可以對多行資料進行操作,并傳回一個結果。比如 sum(x)

傳回結果集中 x 列的總合。

一、字元函數

字元函數接受字元參數,這些參數可以是表中的列,也可以是一個字元串表達式。

常用的字元函數:

函數

說明

ascii(x)

傳回字元x的ascii碼

concat(x,y)

連接配接字元串x和y

instr(x,str[,start][,n)

從x中查找str,可以指定從start開始,也可以指定從n開始

length(x)

傳回x的長度

lower(x)

x轉換成小寫

upper(x)

x轉換成大寫

ltrim(x[,trim_str])

把x的左邊截去trim_str字元串,預設截去空格

rtrim(x[,trim_str])

把x的右邊截去trim_str字元串,預設截去空格

trim([trim_str  from]x)

把x的兩邊截去trim_str字元串,預設截去空格

replace(x,old,new)

在x中查找old,并替換成new

substr(x,start[,length])

傳回x的字串,從start處開始,截取length個字元,預設length,預設到結尾

一些其它的字元函數

1、chr :根據ascii碼傳回對應的字元

2、lpad和rpad :填充

3、trim :去除左右兩邊的空格符

4、length :字元串長度

decode :逐個值替換 (類似與case end/switch結構)

上面各函數的例子:

示例

示例結果

select ascii('a') from dual;

97

select concat('hello','world') from dual;

helloworld

select instr('hello world','or') from dual;

8

select length('hello') from dual;

5

select lower('hello') from dual;

hello

select upper('hello') from dual;

select ltrim('=hello=','=') from dual;

hello=

select rtrim('=hello=','=') from dual;

=hello

select trim('='from'=hello=') from dual;

select replace('abcde','cd','aaa')from dual;

abaaae

select substr('abcde',2,3) from dual;

bcd

   函數

   輸入

  輸出

initcap(char)

select initcap(‘hello’) from dual;

lower(char)

select lower(‘fun’) from dual;

fun

upper(char)

select upper(‘sun’) from dual;

sun

ltrim(char,set)

select ltrim( ‘xyzadams’,’xyz’) from dual;

adams

rtrim(char,set)

select rtrim(‘xyzadams’,’ams’) from dual;

xyzad

translate(char, from, to)

select translate('jack','jac' ,'ban') from dual;

bank

replace(char, searchstring,rep string)

select replace(‘jack and juejac’ ,’jac’,’bl’) from dual;

blk and jue bl

instr (s1, s2 [,i ,j])

select instr (‘worldwide’,’d’) from dual;

substr (s, m, n)

select substr(‘abcdefg’,3,2) from dual;

cd

concat (expr1, expr2)

select concat (‘hello’,’ world’) from dual;

hello world

二、數字函數

數字函數接受數字參數,參數可以來自表中的一列,也可以是一個數字表達式。

abs(x)

x的絕對值

abs(-3)=3

acos(x)

x的反餘弦

acos(1)=0

cos(x)

餘弦

cos(1)=0.54030230586814

ceil(x)

大于或等于x的最小值

ceil(5.4)=6

floor(x)

小于或等于x的最大值

floor(5.8)=5

log(x,y)

x為底y的對數

log(2,4)=2

mod(x,y)

x除以y的餘數

mod(8,3)=2

power(x,y)

x的y次幂

power(2,3)=8

round(x[,y])

x在第y位四舍五入

round(3.456,2)=3.46

sqrt(x)

x的平方根

sqrt(4)=2

trunc(x[,y])

x在第y位截斷

trunc(3.456,2)=3.45

說明:

1.  round(x[,y]),四舍五入。

在預設 y 時,預設 y=0;比如:round(3.56)=4。

y 是正整數,就是四舍五入到小數點後 y 位。round(5.654,2)=5.65。

y 是負整數,四舍五入到小數點左邊|y|位。round(351.654,-2)=400。

2.  trunc(x[,y]),直接截取,不四舍五入。

在預設 y 時,預設 y=0;比如:trunc (3.56)=3。

y是正整數,就是四舍五入到小數點後 y 位。trunc (5.654,2)=5.65。

y 是負整數,四舍五入到小數點左邊|y|位。trunc (351.654,-2)=300。

abs(n)

select abs(-15) from dual;

15

ceil(n)

select ceil(44.778) from dual;

45

floor(n)

select floor(100.2) from dual;

100

cos(n)

select cos(180) from dual;

-.5984601

power(m,n)

select power(4,3) from dual;

64

mod(m,n)

select mod(10,3) from dual;

1

round(m,n)

select round(100.256,2) from dual;

100.26

trunc(m,n)

select trunc(100.256,2) from dual;

100.25

sqrt(n)

select sqrt(16) from dual;

4

sign(n)

select sign(-30) from dual;

-1

三、日期函數

日期函數對日期進行運算。常用的日期函數有:

1、add_months(d,n),在某一個日期 d 上,加上指定的月數 n,傳回計算後的新日期。

d 表示日期,n 表示要加的月數。

例:select sysdate,add_months(sysdate,5) from dual;

Oracle——函數(單行函數、分組函數、分析函數)

2、last_day(d),傳回指定日期當月的最後一天。

例:select sysdate,last_day(sysdate) from dual;

Oracle——函數(單行函數、分組函數、分析函數)

3、round(d[,fmt]),傳回一個以 fmt 為格式的四舍五入日期值, d 是日期, fmt 是格式

模型。預設 fmt 為 ddd,即月中的某一天。

 ① 如果 fmt 為“year”則舍入到某年的 1 月 1 日,即前半年舍去,後半年作為下一年。

② 如果 fmt 為“month”則舍入到某月的 1 日,即前月舍去,後半月作為下一月。

③ 預設為“ddd”,即月中的某一天,最靠近的天,前半天舍去,後半天作為第二天。

④ 如果 fmt 為“day”則舍入到最近的周的周日,即上半周舍去,下半周作為下一周周日。

例:select sysdate,round(sysdate),round(sysdate,'day'),

round(sysdate,'month'),round(sysdate,'year') from dual;

Oracle——函數(單行函數、分組函數、分析函數)

與 round 對應的函數時 trunc(d[,fmt])對日期的操作, trunc 與 round 非常相似,隻是不對日期進行舍入,直接截取到對應格式的第一天。

4、extract(fmt from d),提取日期中的特定部分。

fmt 為:year、month、day、hour、minute、second。其中 year、month、day可以為 date 類型比對,也可以與 timestamp 類型比對;但是 hour、minute、second 必須與 timestamp 類型比對。

hour 比對的結果中沒有加上時區,是以在中國運作的結果小 8 小時。

例:select sysdate "date",

       extract(year from sysdate)"year",

       extract(month from sysdate)"month",

       extract(day from sysdate)"day",

       extract(hour from systimestamp)"hour",

       extract(minute from systimestamp)"minute",

       extract(second from systimestamp)"second"

from dual;

Oracle——函數(單行函數、分組函數、分析函數)

四、轉換函數

轉換函數将值從一種資料類型轉換為另外一種資料類型。常見的轉換函數有:

1、to_char(d|n[,fmt])

把日期和數字轉換為制定格式的字元串。fmt是格式化字元串

代碼示範:to_char對日期的處理

select to_char(sysdate,'yyyy"年"mm"月"dd"日" hh24:mi:ss')"date" from dual;

Oracle——函數(單行函數、分組函數、分析函數)

代碼解析:

在格式化字元串中,使用雙引号對非格式化字元進行引用

針對數字的格式化,格式化字元有:

參數

9

999

指定位置處顯示數字

.

9.9

指定位置傳回小數點

,

99,99

指定位置傳回一個逗号

$

$999

數字開頭傳回一個美元符号

eeee

9.99eeee

科學計數法表示

l

l999

數字前加一個本地貨币符号

pr

999pr

如果數字式負數則用尖括号進行表示

代碼示範:to_char對數字的處理

select to_char(-123123.45,'l9.9eeeepr')"date" from dual;

Oracle——函數(單行函數、分組函數、分析函數)

2、to_date(x,[,fmt])

把一個字元串以fmt格式轉換成一個日期類型

3、to_number(x,[,fmt])

把一個字元串以fmt格式轉換為一個數字

代碼示範:to_num函數

select to_number('-$12,345.67','$99,999.99')"num" from dual;

Oracle——函數(單行函數、分組函數、分析函數)

五、其它單行函數

1、nvl(x,value)

如果x為空,傳回value,否則傳回x

例:對工資是2000元以下的員工,如果沒發獎金,每人獎金100元

代碼示範:nvl函數

2、nvl2(x,value1,value2)

如果x非空,傳回value1,否則傳回value2

例:對emp表中工資為2000元以下的員工,如果沒有獎金,則獎金為200元,如果有獎金,則在原來的獎金基礎上加100元

代碼示範:nvl2函數

3、nullif(表達式1,表達式2)

如果表達式1和表達式2相等則傳回空值,如果表達式1和表達式2不相等則傳回表達式1的結果

聚合函數同時對一組資料進行操作,傳回一行結果,比如計算一組資料的總和,平均值

等。

名稱

作用

文法

avg

平均值

avg(表達式)

sum

求和

sum(表達式)

min、max

最小值、最大值

min(表達式)、max(表達式)

count

資料統計

count(表達式)

例:求本月所有員工的基本工資總和

代碼示範:sum函數

例:求不同部門的平均工資

代碼示範:avg函數下的分組查詢

分析函數根據一組行來計算聚合值,用于計算完成聚集的累計排名、移動平均數等,分析函數為每組記錄傳回多個行。

常用的分析函數有

1、row_number:傳回連續的序号,不論值是否相等

2、rank:具有相等值的行排位相同,序号随後跳躍

3、dense_rank:具有相等值的行排位相同,序号是連續的

以上三個分析函數用于計算一個行在一組有序行中的排位,序号從1開始。

分析函數和聚合函數的不同之處

普通的聚合函數用group by分組,每個分組傳回一個統計值,而分析函數采用partition by分組,并且每組每行都可以傳回一個統計值。

分析函數的形式

分析函數帶有一個開窗函數over(),包含三個分析子句:分組(partition by), 排序(order by), 視窗(rows) ,他們的使用形式如下:over(partition by xxx order by yyy rows between zzz)。

分析函數例子(在scott使用者下模拟)

示例目的:顯示各部門員工的工資,并附帶顯示該部分的最高工資。

rank()值相同時排名相同,其後排名跳躍不連續