Oracle SQL 提供了用于執(zhí)行特定操作的專(zhuān)用函數(shù)。這些函數(shù)增強(qiáng)了 SQL 語(yǔ)言的功能。函數(shù)可以接受零個(gè)或者多個(gè)輸入?yún)?shù),并返回一個(gè)輸出結(jié)果。 Oracle 數(shù)據(jù)庫(kù)中主要使用兩種類(lèi)型的函數(shù):
單行函數(shù):對(duì)每一個(gè)函數(shù)應(yīng)用在表的記錄中時(shí),只能輸入一行結(jié)果,返回一個(gè)結(jié)果。
例如:MOD(x,y)返回 x 除以 y 的余數(shù)(x 和 y 可以是兩個(gè)整數(shù),也可以是表中的整數(shù)列)。常用的單行函數(shù)有:
字符函數(shù):對(duì)字符串操作。
數(shù)字函數(shù):對(duì)數(shù)字進(jìn)行計(jì)算,返回一個(gè)數(shù)字。
轉(zhuǎn)換函數(shù):可以將一種數(shù)據(jù)類(lèi)型轉(zhuǎn)換為另外一種數(shù)據(jù)類(lèi)型。
日期函數(shù):對(duì)日期和時(shí)間進(jìn)行處理。聚合函數(shù):聚合函數(shù)同時(shí)可以對(duì)多行數(shù)據(jù)進(jìn)行操作,并返回一個(gè)結(jié)果。例如:SUM(x),返回結(jié)果集中 x 列的總合。
以下詳細(xì)介紹各類(lèi)函數(shù)的使用。
(1)轉(zhuǎn)換函數(shù)
轉(zhuǎn)換函數(shù)將值從一種數(shù)據(jù)類(lèi)型轉(zhuǎn)換為另外一種數(shù)據(jù)類(lèi)型。
TO_DATE(X,[,fmt]) 把一個(gè)字符串以fmt格式轉(zhuǎn)換成一個(gè)日期類(lèi)型
具體如何輸出需要看本地PL/SQL的首選項(xiàng)設(shè)置時(shí)間格式設(shè)置。以下例子的輸出結(jié)果,格式均為 yyyy/mm/dd hh:mi:ss
--將字符串轉(zhuǎn)換為日期
SELECT TO_DATE('2019-12-31', 'yyyy-mm-dd') FROM DUAL;--輸出:2019/12/31
SELECT TO_DATE('2019-12-31 15:20:45', 'yyyy-mm-dd hh24:mi:ss') FROM DUAL; --輸出:2019/12/31 15:20:45
SELECT TO_DATE('2019年12月31日', 'yyyy"年"mm"月"dd"日') AS T FROM DUAL;--輸出:2019/12/31
--兩個(gè)日期間的天數(shù)
SELECT FLOOR(SYSDATE - TO_DATE('20191201', 'yyyymmdd')) FROM DUAL;--輸出:170
--查詢(xún)某個(gè)時(shí)間段內(nèi)的數(shù)據(jù)
select * from t_user l
where l.start_date between to_date(q'/2020-05-12 00:00:00/', 'yyyy-mm-dd hh24:mi:ss')
and to_date(q'/2020-05-12 23:00:00/', 'yyyy-mm-dd hh24:mi:ss');
TO_CHAR:轉(zhuǎn)換為字符串
--日期轉(zhuǎn)化為字符串
SELECT TO_CHAR(SYSDATE, 'yyyy-mm-dd hh24:mi:ss') AS NOWTIME FROM DUAL; --2020-05-19 16:09:38
--獲取時(shí)間的年
SELECT TO_CHAR(SYSDATE, 'yyyy') AS NOWYEAR FROM DUAL; -- 2020
--獲取時(shí)間的月
SELECT TO_CHAR(SYSDATE, 'mm') AS NOWMONTH FROM DUAL; -- 05
--獲取時(shí)間的日
SELECT TO_CHAR(SYSDATE, 'dd') AS NOWDAY FROM DUAL; -- 19
--獲取時(shí)間的時(shí)
SELECT TO_CHAR(SYSDATE, 'hh24') AS NOWHOUR FROM DUAL; -- 16
--獲取時(shí)間的分
SELECT TO_CHAR(SYSDATE, 'mi') AS NOWMINUTE FROM DUAL; -- 10
--獲取時(shí)間的秒
SELECT TO_CHAR(SYSDATE, 'ss') AS NOWSECOND FROM DUAL; -- 26
TO_NUMBER(X,[,fmt]) 把一個(gè)字符串以fmt格式轉(zhuǎn)換為一個(gè)數(shù)字
SELECT TO_NUMBER('-$12,345.67','$99,999.99')"num" FROM dual;
結(jié)果:-12345.67
(2)字符函數(shù)
字符函數(shù)接受字符參數(shù),這些參數(shù)可以是表中的列,也可以是一個(gè)字符串表達(dá)式。
INSTR (string, set[, start[, occurrence] ] ),該命令“string”中從“start”位置開(kāi)始查找字符集合的位置,再查找“set”出現(xiàn)的第一次、第二次等等的“occurrence”(次數(shù))?!皊tart”的值也可以是負(fù)數(shù),代表從字符串結(jié)尾開(kāi)始向反方向搜索。
select instr('abc','a') from dual; -- 返回 1
select instr('abc','bc') from dual; -- 返回 2
select instr('abc abc','a',1,2) from dual; -- 返回 5
select instr('abc','bc',-1,1) from dual; -- 返回 2
select instr('abc','d') from dual; -- 返回 0
LTRIM(string,trim_set)從左邊刪除字符,此處“string”是數(shù)據(jù)庫(kù)的列,或者是字面字符串,而“trim_set” 是要去掉的字符的集合。
SELECT LTRIM('abcdab','a') FROM DUAL;
結(jié)果:bcdab
RTRIM(string,trim_set)從右側(cè)刪除字符,此處“string”是數(shù)據(jù)庫(kù)的列,或者是字面字符串,而“trim_set” 是要去掉的字符的集合。
SELECT RTRIM('abcdef', 'f') FROM DUAL;
結(jié)果:abcde
REPLACE(string, if, then)用 0 或其他字符代替字符串中的字符?!癷f”是字符或字符串,對(duì)于每個(gè)出現(xiàn)在“string”中的“if”,都用“then”的內(nèi)容代替。
SELECT REPLACE('JACK and JUE','J','BL') FROM DUAL;
結(jié)果:BLACK and BLUE
SUBSTR(string, start [,count])返回“string”中截取的一部分。該命令截取“string”的一個(gè)子集,從“start”位置開(kāi)始,持續(xù)“count”個(gè)字符。如果不指定“count”,則從“start”開(kāi)始截取到“string”的尾部。
SELECT SUBSTR('ABCDEFGIJKLM',3,4) FROM DUAL;
結(jié)果:CDEF
TRANSLATE(string, if, then)“if”中字符的位置,并檢查“then”的相同位置,然后用該位置的字符替換 “string”中的字符。
SELECT TRANSLATE('sdfdfAEIOU3333','AEIOU', '1111') FROM DUAL;
結(jié)果:sdfdf11113333
UPPER(string) 返回大寫(xiě)的“string”。
SELECT UPPER('aptech computer education') FROM dual;
結(jié)果:APTECH COMPUTER EDUCATION
(3)數(shù)值型常用函數(shù)
數(shù)字函數(shù)接受數(shù)字參數(shù),參數(shù)可以來(lái)自表中的一列,也可以是一個(gè)數(shù)字表達(dá)式。
round 取四舍五入的幾位小數(shù)
select round(1.2345, 3) from dual;
結(jié)果:1.235
trunc(x,[y]) 返回截尾到y(tǒng)位小數(shù)的x值
y是正整數(shù),就是四舍五入到小數(shù)點(diǎn)后 y 位。TRUNC (5.654,2)=5.65。
y 是負(fù)整數(shù),四舍五入到小數(shù)點(diǎn)左邊|y|位。TRUNC (351.654,-2)=300。
select trunc(1.2345, 2) from dual;
結(jié)果:1.23
select trunc(23.33) from dual;
結(jié)果: 23
select trunc(1.2399, 2) from dual;
結(jié)果:1.23
select CASE WHEN trunc(1.00)-1.00=0 THEN '整數(shù)' ELSE '不是整數(shù)' END from dual;
結(jié)果:整數(shù)
ceil(n) 返回大于或等于x的最大整數(shù)
select ceil(23.33) from dual;
結(jié)果: 24
floor(n) 返回等于或小于n的最大整數(shù):
select floor(23.33) from dual;
結(jié)果: 23
round(n,m) 將n四舍五入,保留小數(shù)點(diǎn)后m位
select round(123.5678,2) from dual;
結(jié)果: 123.57
select round(23.33) from dual;
結(jié)果: 23
mod(m,n) m除以n的余數(shù),若n=0,則返回m
select mod(7,5) from dual;
結(jié)果: 2
sign(n) 若n=0,則返回0,否則,n>0,則返回1,n<0,則返回-1
select sign(12) from dual;
結(jié)果: 1
power(m,n) m的n次方
select power(3,2) from dual;
結(jié)果: 9
sqrt(n) n的平方根
select sqrt(25) from dual ;
結(jié)果: 5
(4)常用字符函數(shù)
字符函數(shù)接受字符參數(shù),這些參數(shù)可以是表中的列,也可以是一個(gè)字符串表達(dá)式。
initcap(char) 把每個(gè)字符串的第一個(gè)字符換成大寫(xiě)
select initicap('mr.ecop') from dual;
結(jié)果: Mr.Ecop
lower(char) 整個(gè)字符串換成小寫(xiě)
select lower('MR.ecop') from dual;
結(jié)果: mr.ecop
replace(char,str1,str2) 字符串中所有str1換成str2
select replace('Scott','s','Boy') from dual;
結(jié)果: Boycott
substr(char,m,n) 取出從m字符開(kāi)始的n個(gè)字符的子串
select substr('ABCDEF',2,2) from dual;
結(jié)果: CD
length(char) 求字符串的長(zhǎng)度
select length('ACD') from dual;
結(jié)果: 3
|| 并置運(yùn)算符
select 'ABCD'||'EFGH' from dual;
結(jié)果: ABCDEFGH
(5)聚合函數(shù)
聚合函數(shù)同時(shí)對(duì)一組數(shù)據(jù)進(jìn)行操作,返回一行結(jié)果,比如計(jì)算一組數(shù)據(jù)的總和,平均值等。
AVG(表達(dá)式)求平均值
SUM(表達(dá)式) 求和
MIN(表達(dá)式)、MAX(表達(dá)式) 最小值、最大值
COUNT(表達(dá)式)數(shù)據(jù)統(tǒng)計(jì)
(6)其它單行函數(shù)
NVL(exp1,exp2):如果 exp1的值為null,則返回exp2的值,否則返回exp1的值。
SELECT ename,NVL(col, 0) FROM TEST; --如果col列為null,則返回0
NVL2(exp1,exp2,exp2):
如果exp1的值為null,則返回exp2的值,否則返回exp3的值。