數據庫常用函數


字符函數

函數 說明
ascii(x)

返回x的ascii值

select ascii('a') from dual; -- 97
concat(x,y)

返回x和y的拼接字符串

select concat('a','b') from dual; -- ab
instr(strObj,strSearch[,start[,n]])

在strObj中查找strSearch內容,從start位置開始找起,返回第n個結果的索引,start和n默認為1,可以不指定

select instr(‘a1a2a3a4’,‘a’) from dual; -- 1 索引從1開始

select instr(‘a1a2a3a4’,‘a’,2) from dual; -- 從索引2開始找a,結果是3

select instr(‘a1a2a3a4’,‘a’,2,2) from dual; -- 從索引2開始返回第二個結果,索引為5

length(x)

x的長度

select length('abc') from dual; -- 3
lower(x)

x的小寫形式

select lower(‘aBcD’) from dual; -- abcd
upper(x)

x的大寫形式

select upper(‘aBcD’) from dual; -- ABCD
ltrim(x[,str])

去掉左邊的字符串,默認是空格

select length(ltrim(’ abc’)) from dual; -- 3,因為結果是’abc’去掉了左邊的空格

select length(ltrim(’***abc’,’*’)) from dual; –- 去掉字符串中的* 結果為3
rtrim(x[,str]) 類似於ltrim,該函數是去掉右邊的字符
trim(x[,str]) 去掉左右兩邊的字符
replace(strObj,old,new)

替換字符中的old為new

select replace(‘a1a1a1’,‘1’,‘a’) from dual; -- aaaaaa
substr(strObj,star[,length])

從strObj中截取字符串,star是開始位置,length可以省略,默認從star位置截取到strObj最后

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

select substr(‘abcdefg’,2,4) from dual; -- bcde
regexp_substr(strObj,'[^,]+',star,number)

從strObj中截取字符串,'[^,]+'是正則表達式,此處表示匹配除了逗號至少出現一次的字符,star是開始位置,number是第幾個字段

select regexp_substr('7788,5566,8899','[^,]+',1,1) from dual; -- 7788

select regexp_substr('7788,5566,8899','[^,]+',1,2) from dual; -- 5566

數字函數

函數 說明
sign(x)

判斷x是正數還是負數,正數返回1,負數返回0

select sign(-1) from dual; -- 0
select sign(3) from dual; -- 1
abs(x)

取x的絕對值

select abs(-1) from dual; -- 1
ceil(x)

大於或等於x的最小值

select ceil(1.1) from dual; -- 2

select ceil(-1.9) from dual; -- -1
floor(x)

返回小於或等於x的最大值

select floor(1.9) from dual; -- 1

select floor(-1.1) from dual; -- -2
round(x[,y])

在y位上四舍五入,y可以省略,默認取值並四舍五入

select round(3.45),round(3.51),round(3.4444,2),round(3.5555,2) from dual; -- 3,4,3.44,3.56
trunc(x[,y]) 在y位上截斷,y省略的話是取整,不會四舍五入,只是簡單截斷
mod(x,y)

求x除以y的余數

select mod(5,2) from dual; -- 1

日期函數

對日期或時間的處理,sysdate在Oracle中是當前時間的關鍵字

函數 說明
add_months(date,n)

在date參數上增加一個n的月

select sysdate,add_months(sysdate,1) from dual; -- 2021/1/23 16:41:47 , 2021/2/23 16:41:47
last_day(date)

返回data參數所在月的最后一天的日期

select last_day(sysdate) from dual; -- 2021/1/31 16:47:32
round(date[,fmt])

返回四舍五入的日期,fmt默認是’DDD’,月中的某一天,fmt取值可以是’YEAR’,‘MONTH’,‘DDD’,'DAY’

select sysdate,round(sysdate),round(sysdate,'year'),round(sysdate,'month'),round(sysdate,'day') from dual; -- 2021/1/23 16:48:48 , 2021/1/24 , 2021/1/1 , 2021/2/1 , 2021/1/24
months_between(d1,d2)

d1和d2之間的月份差

select months_between(sysdate,add_months(sysdate,2)) from dual; -- -2
next_day(date,'星期一')

指定日期后的下一個星期一(也可以是星期二等等)

select next_day(sysdate,'星期一') from dual; -- 2021/1/25 16:51:39
extract(month from date)

從指定日期中提取月份

select extract(month from sysdate) from dual; -- 12 month還可以是day,year提取日期和年
trunc(date,fmt)

截斷日期fmt,fmt可以是month/year,相當於只要月或年的信息

select trunc(sysdate,‘month’) from dual; --2021/1/1日期信息沒有了,只保留到月,年也類似。

轉換函數

函數 說明
to_date(datastr,fmt)

把字符串形式的日期信息按照fmt格式進行轉換

select to_date('2020-12-20 15:33:44','yyyy-mm-dd hh24:mi:ss') from dual;
to_char(dataobj,fmt)

把日期對象顯示為fmt指定的日期格式,還可以把數字轉換為字符串形式

select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
to_number(numberStr,fmt)

把字符形式的數字按照一定的格式轉換為數字

select to_number('00123') from dual; -- 123

select to_number('12345.678', '99999.999') from dual; -- 12345.678,參數1和2要對應,參數2可以比參數1位數多,但不能反過來

統計函數

在分組的情況下使用

函數 說明
sum 求和函數
count 統計數據數目
avg 求平均值
max 求最大值
min 求最小值

nvl和nvl2函數

在上表中,如果要加sal+comm列時,comm有的列為null,不能參與運算,會使原有的sal都顯示不出來:

此時可以使用nvl函數,nvl函數可以把一列中值為null的值變成想要的值來進行運算:

SELECT sal,comm,sal+NVL(comm,0) FROM emp;

nvl(col,value):當col為null時,返回value的值

nvl2(expr1,expr2,expr3):如果expr1值為null,返回expr3的值,如果expr1值不為null,則返回expr2的值

select nvl2(null,1,0),nvl2('abc',1,0) from dual; -- 0  1

decode函數

decode(條件,值1,返回值1,值2,返回值2,....,值n,返回值n,缺省值):這個函數有switch和if的特征

行轉列

decode函數配置統計函數可以實現行轉列的效果,下面有表:

姓名 科目 成績
趙一 Java 100
趙一 C 90
趙一 C++ 95
錢二 Java 90
錢二 C 100
錢二 C++ 99

想要把這個表中的數據轉換為下面的格式:

姓名 Java C C++
趙一 100 90 95
錢二 90 100 99

首先使用decode函數:

-- ++是特殊字符用2代替了++
SELECT 姓名,
       DECODE(科目, 'Java', 成績) JAVA,
       DECODE(科目, 'C', 成績) C,
       DECODE(科目, 'C++', 成績) C2
  FROM 成績表 GROUP BY 姓名 ;
姓名 Java C C2
趙一 100
趙一 90
趙一 95
錢二 90
錢二 100
錢二 99

使用decode函數后變為上表,解決方法:使用分組和sum函數,將姓名一樣的數據合為一條:

SELECT 姓名,
       SUM(DECODE(科目, 'Java', 成績)) JAVA,
       SUM(DECODE(科目, 'C', 成績)) C,
       SUM(DECODE(科目, 'C++', 成績)) C2
  FROM 成績表 GROUP BY 姓名 ;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM