1、序言
Oracle提供了不少內建函式,熟練使用這些函式,可以大大提高我們工作效率。函式可以接受0個或多個入參,並返回一個輸出結果。
2、Oracle函式分類
Oracle函式分為單行函式和聚合函式
-
單行函式:對每一個函式應用在表的記錄中時,只能輸入一行結果,返回一個結果。
常見的單行函式有如下四種
① 數值型函式:對數字進行計算,返回一個數字。
②字元函式:對字串操作。
③轉換函式:可以將一種資料型別轉換為另外一種資料型別。
④日期函式:對日期和時間進行處理。
⑤ null函式:處理null值的相關函式
-
聚合函式:聚合函式同時可以對多行資料進行操作,並返回一個結果。
3、數值型函式
3.1 求絕對值函式
abs(n)函式
用於返回絕對值
SQL> select abs(10),abs(-10),abs('100') from dual;
ABS(10) ABS(-10) ABS('100')
---------- ---------- ----------
10 10 100
3.2 求餘函式
mod(n2,n1)
返回n2除以n1的餘數
SQL> select mod(5,2),mod(8/3,3),mod('10',2),mod(-10,6),mod(3,0) from dual;
MOD(5,2) MOD(8/3,3) MOD('10',2) MOD(-10,6) MOD(3,0)
---------- ---------- ----------- ---------- ----------
1 2.66666666 0 -4 3
3.3 判斷數值正負函式
sign(n) 函式
n為正返回1,n為0返回0,n為負返回-1
SQL> select sign(-2),sign(2),sign(0.0),sign(-3*2) from dual;
SIGN(-2) SIGN(2) SIGN(0.0) SIGN(-3*2)
---------- ---------- ---------- ----------
-1 1 0 -1
3.4 三角函式
cos(n):返回餘弦值 acos(n):返回反餘弦值 sin(n):返回正弦值 asin(n) tan(n):返回正切值 atan(n):返回反正切值
SQL> select cos(3.1415926),acos(1),sin(0.5),asin(1),tan(1),atan(1) from dual;
COS(3.1415926) ACOS(1) SIN(0.5) ASIN(1) TAN(1) ATAN(1)
-------------- ---------- ---------- ---------- ---------- ----------
-0.99999999999 0 0.47942553 1.57079632 1.55740772 0.78539816
3.5 返回以指定數值為準整數的函式
ceil(n)函式
返回大於等於n的最小整數
SQL> select ceil(15),ceil(15.6),ceil(-10.2),ceil('10.2') from dual;
CEIL(15) CEIL(15.6) CEIL(-10.2) CEIL('10.2')
---------- ---------- ----------- ------------
15 16 -10 11
floor(n)函式
返回小於或等於n的最大整數
SQL> select floor(15),floor(15.6),floor(-10.2),floor('10.2') from dual;
FLOOR(15) FLOOR(15.6) FLOOR(-10.2) FLOOR('10.2')
---------- ----------- ------------ -------------
15 15 -11 10
3.6 指數、對數函式
sqrt(n)函式
返回n的平方根
SQL> select sqrt(4),sqrt('8.9') from dual;
SQRT(4) SQRT('8.9')
---------- -----------
2 2.983286778
power(n1,n2)函式
返回n1的n2次冪
SQL> select power(3,2),power('4',2),power(2.5,4),power(-5,2)from dual;
POWER(3,2) POWER('4',2) POWER(2.5,4) POWER(-5,2)
---------- ------------ ------------ -----------
9 16 39.0625 25
log(n1,n2)
返回以n1為底n2的對數
SQL> select log(10,100),log(2.4,'10') from dual;
LOG(10,100) LOG(2.4,'10')
----------- -------------
2 2.63011686739
3.7 四捨五入函式
round(x[,y]) 函式
- 會四捨五入。在預設 y 時,預設 y=0;
- y 是正整數,就是四捨五入到小數點後 y 位;
- y 是負整數,四捨五入到小數點左邊|y|位
SQL> select round(3.564),round(3.456,2),round(3456.345,-2) from dual;
ROUND(3.564) ROUND(3.456,2) ROUND(3456.345,-2)
------------ -------------- ------------------
4 3.46 3500
trunc(x[,y])函式
- 直接擷取,不四捨五入。在預設 y 時,預設 y=0;
- Y是正整數,就是四捨五入到小數點後 y位;
- y 是負整數,四捨五入到小數點左邊|y|位。
SQL> select trunc(3.564),trunc(3.456,2),trunc(3456.345,-2) from dual;
TRUNC(3.564) TRUNC(3.456,2) TRUNC(3456.345,-2)
------------ -------------- ------------------
3 3.45 3400
4 字元型函式
4.1 ASSCII與字元轉換函式
ASSCII(x) 函式
返回字元x首字母的ASSCII值
SQL> select ascii('榮'),ascii('Xiezhr'),ascii('xiezhr') from dual;
ASCII('榮') ASCII('XIEZHR') ASCII('XIEZHR')
----------- --------------- ---------------
51417 88 120
chr(n)函式
與ASSCII函式相反,將ASSCII碼轉換為字元
SQL> select chr(51417),chr(88),chr(120) from dual;
CHR(51417) CHR(88) CHR(120)
---------- ------- --------
榮 X x
4.2 獲取字串長度
length(string)
返回string所佔的位元組長度,單位是位元組
SQL> select length('公眾號XiezhrSpace') from dual;
LENGTH('公眾號XIEZHRSPACE')
---------------------------
14
lengthb(string)
返回string所佔的字元長度,單位是字元
SQL> select lengthb('公眾號XiezhrSpace') from dual;
LENGTHB('公眾號XIEZHRSPACE')
----------------------------
17
注意:上面例子,字串是統一個,但是兩個函式返回的值是不一樣的。所以可以根據length(‘string’)=lengthb(‘string’)判斷字串是否含有中文
4.3 字串擷取函式
-
substr(x,start[,length])
-
從start處開始,擷取length個字元;
-
預設length,預設到結尾;
-
length為正,從左邊擷取;
-
length為負從右邊擷取
SQL> select substr('公眾號XiezhrSpace',4) a,substr('公眾號XiezhrSpace',4,11) b,substr('公眾號XiezhrSpace',-11,11) c from dual;
A B C
----------- ----------- -----------
XiezhrSpace XiezhrSpace XiezhrSpace
- substrb(x,start[,length])
函式與substr不同之處是按照位元組擷取
SQL> select substrb('公眾號XiezhrSpace',7) a,substrb('公眾號XiezhrSpace',7,17) b,substrb('公眾號XiezhrSpace',-11,11) c from dual;
A B C
----------- ----------- -----------
XiezhrSpace XiezhrSpace XiezhrSpace
還有幾個擷取函式,但是不常用
- substrc 以Unicode字元為單位擷取
- substr4 以UCS4程式碼點位單位
- substr2 以UCS2程式碼點位單位
4.4 字串連線函式
concat(x,y)
- 效果和“||”連線一樣,將字串x和y連線起來
SQL> select concat('公眾號','XiezhrSpace'),'公眾號'||'XiezhrSpace' from dual;
CONCAT('公眾號','XIEZHRSPACE') '公眾號'||'XIEZHRSPACE'
------------------------------ -----------------------
公眾號XiezhrSpace 公眾號XiezhrSpace
4.5 字串搜尋函式
-
instr( string1, string2 [, start_position [, n ] ] )
-
從start_position開始,目標字串string2在源字串string1中出現第n次的位置;
-
start_position為正表示從string1左邊開始,為負表示從string1右邊開始;
-
start_position、n可以去掉,表示string2在string1第一次出現位置
SQL> select instr('公眾號XiezhrSpace','Xiezhr') a,instr('公眾號XiezhrSpace','xiezhr') b,instr('公眾號XiezhrSpace','Xiezhr',2,1) c,instr('公眾號XiezhrSpace','Xiezhr',-1,1) d from dual;
A B C D
---------- ---------- ---------- ----------
4 0 4 4
- instrb( string1, string2 [, start_position [, n ] ] )
以位元組為單位搜尋
SQL> select instrb('公眾號XiezhrSpace','Xiezhr') a,instrb('公眾號XiezhrSpace','xiezhr') b,instrb('公眾號XiezhrSpace','Xiezhr',2,1) c,instrb('公眾號XiezhrSpace','Xiezhr',-1,1) d from dual;
A B C D
---------- ---------- ---------- ----------
7 0 7 7
跟字串擷取函式一樣,還有幾個搜尋函式
- instrc 以Unicode字元為單位擷取
- instr4 以UCS4程式碼點位單位
- instr2 以UCS2程式碼點位單位
4.6 字母大小寫轉換函式
- upper(n)函式
將字串n全部轉換為大寫
SQL> select upper('xiezhrspace'),upper('x') from dual;
UPPER('XIEZHRSPACE') UPPER('X')
-------------------- ----------
XIEZHRSPACE X
- lower(n)函式
將字串n全部轉換為小寫
SQL> select lower('X'),lower('XIEZHRSPACE') from dual;
LOWER('X') LOWER('XIEZHRSPACE')
---------- --------------------
x xiezhrspace
4.7 字串替換函式
replace(char,search_string[,replacement_string])
- char是目標字串
- earch_string是要替換的字串
- replacement_string引數可選,用它替換被搜尋到的字串,如果引數不用表示從char中刪除earch_string字串**
SQL> select replace('公眾號XiezhrSpace','公眾號','公眾號:')a,replace('公眾號XiezhrSpace','公眾號')b from dual;
A B
------------------ -----------
公眾號:XiezhrSpace XiezhrSpace
4.8 字串填充函式
- **rpad(exp1,n[,exp2]) **
在字串exp1右邊用字串exp2填充,直到整個字串長度為n為止;如果exp2引數沒有,則以空格填充
SQL> select rpad('xiezhr',10,'0'),rpad('xiezhr',10) from dual;
RPAD('XIEZHR',10,'0') RPAD('XIEZHR',10)
--------------------- -----------------
xiezhr0000 xiezhr
- lpad(exp1,n[,exp2])
在字串exp1左邊用字串exp2填充,直到整個字串長度為n為止;如果exp2引數沒有,則以空格填充
SQL> select lpad('xiezhr',10,'0'),lpad('xiezhr',10) from dual;
LPAD('XIEZHR',10,'0') LPAD('XIEZHR',10)
--------------------- -----------------
0000xiezhr xiezhr
4.9 刪除字串首尾指定字元函式
trim([leading|trailing|both][trim_target from trim_source])函式
- leading:刪除trim_source的字首字元
- trailing:刪除trim_source的字尾字元
- both: 刪除trim_source的字首和字尾字元
- trim_target:刪除的指定字串,預設是空格
- trim_source:被操作字串
SQL> select trim(trailing '公' from '公眾號XiezhrSpace公') as a ,trim(leading '我' from '我公眾號XiezhrSpace')as b ,trim(' 公眾號XiezhrSpace ')as c from dual;
A B C
----------------- ----------------- -----------------
公眾號XiezhrSpace 公眾號XiezhrSpace 公眾號XiezhrSpace
rtrim(char[,str])函式
與rpad函式相反,將char右邊出現在str中的字元刪掉,str引數不叫則預設刪除空格
SQL> select rtrim('公眾號XiezhrSpace我的','我的') a,'公眾號XiezhrSpace ' b from dual;
A B
----------------- -------------------
公眾號XiezhrSpace 公眾號XiezhrSpace
ltrim(char[,str])函式
將char右邊出現在str中的字元刪掉,str引數不叫則預設刪除空格
SQL> select ltrim('我的公眾號XiezhrSpace','我的') a ,' 公眾號XiezhrSpace' b from dual;
A B
----------------- --------------------
公眾號XiezhrSpace 公眾號XiezhrSpace
5 日期型函式
5.1 系統時區、日期、時間函式
dbtimezone函式
函式沒有引數,返回資料庫時區
SQL> select dbtimezone from dual;
DBTIMEZONE
----------
+00:00
sysdate函式
函式沒有引數,可以得到系統當前日期
SQL> select sysdate from dual;
SYSDATE
-----------
2021-02-27
systimestamp函式
函式沒有引數,返回系統時間。時間包含時區資訊,精確到微秒。函式可以用於返回遠端資料庫伺服器時間
SQL> select systimestamp from dual;
SYSTIMESTAMP
--------------------------------------------------------------------------------
27-2月 -21 03.06.44.403049 下午 +08:00
5.2 為日期加上指定月份函式
add_months(date,i)函式
- date:指定日期
- i: 要加的月份。i為正,在date日期上加i月;i為負,在date日期上減i月
SQL> select add_months(to_date('2021-01-01','yyyy-mm-dd'),10) a ,add_months(to_date('2021-01-01','yyyy-mm-dd'),-10) b from dual;
A B
----------- -----------
2021-11-01 2020-03-01
5.3 返回指定月份最後一天
last_day(date)函式
返回date日期的最後一天
SQL> select last_day(to_date('2020-01-01','yyyy-mm-dd')) a from dual;
A
-----------
2020-01-31
5.4 返回指定日期後一週的函式
next_day(date,char)函式
SQL> select sysdate, next_day(sysdate,'星期二') a from dual;
SYSDATE A
----------- -----------
2021-02-27 2021-03-02
5.5 提取指定日期特定部分函式
extract(datetime)函式
從給定的datetime中得到年、月、日、時、分、秒
SQL> select sysdate "date",
2 extract(year from sysdate)"year",
3 extract(month from sysdate)"month",
4 extract(day from sysdate)"day",
5 extract(hour from systimestamp)"hour",
6 extract(minute from systimestamp)"minute",
7 extract(second from systimestamp)"second"
8 from dual;
date year month day hour minute second
----------- ---------- ---------- ---------- ---------- ---------- ----------
2021-02-27 2021 2 27 7 25 3.72008
5.6 獲取兩個日期之間月份
month_between(date1,date2)
獲取data1,date2日期之間的月份
SQL> select months_between(to_date('2021-03-02','yyyy-mm-dd'),to_date('2020-01-02','yyyy-mm-dd')) a from dual;
A
----------
14
5.7 日期四捨五入、擷取函式
ronud(date[,fmt])
將date舍入到fmt指定形式,如果fmt引數不加,date被處理到最近一天
SQL> select round(to_date('2020-01-03 21:00:00', 'yyyy-mm-dd hh24:mi:ss'),'month') a,
2 round(to_date('2020-01-03 21:00:00', 'yyyy-mm-dd hh24:mi:ss'),'day') b,
3 round(to_date('2020-01-03 21:00:00', 'yyyy-mm-dd hh24:mi:ss')) c
4 from dual;
A B C
----------- ----------- -----------
2020-01-01 2020-01-05 2020-01-04
trunc(date[,fmt])
將date擷取到fmt指定形式,如果fmt引數不加,date被處理到最近一天
SQL> select trunc(to_date('2020-01-03 21:00:00', 'yyyy-mm-dd hh24:mi:ss'),'month') a,
2 trunc(to_date('2020-01-03 21:00:00', 'yyyy-mm-dd hh24:mi:ss'),'day') b,
3 trunc(to_date('2020-01-03 21:00:00', 'yyyy-mm-dd hh24:mi:ss')) c
4 from dual;
A B C
----------- ----------- -----------
2020-01-01 2019-12-29 2020-01-03
6 轉換函式
6.1 資料型別轉換函式
一般用於數字與字元、字元與日期之間轉換
SQL> select cast(sysdate as varchar2(12)) a,cast('123' as number) b, cast(123 as varchar2(3)) c from dual;
A B C
------------ ---------- ---
27-2月 -21 123 123
6.2 將字串轉換字符集
convert(char,a[,b])函式
- char:待轉換的字串
- a:轉變後的字符集
- b: char原來字符集
SQL> select convert('測試','US7ASCII','ZHS16GBK') a from dual;
A
------------------------------
??
6.3 數值轉換成字串
to_char(number[,fmt])函式
將數值、日期按照指定格式轉換成字串
SQL> select to_char(3.45)a,to_char(3.45,'99.9')b,to_char(sysdate,'yyyy-mm-dd')c from dual;
A B C
---- ----- ----------
3.45 3.5 2021-02-27
6.4 字元轉日期
to_date(char,fmt)函式
將字元按照fmt格式轉換
SQL> select to_date('2020-12-01','yyyy-mm-dd') a from dual;
A
-----------
2020-12-01
6.5 符串轉數字函式
to_number(char[,fmt])函式
將字串char 轉換為數值
SQL> select to_number('34.562','9999.999') from dual;
TO_NUMBER('34.562','9999.999')
------------------------------
34.562
7 null 函式
null值我們經常會遇到的,這時候我們就要學會怎麼處理null值
7.1 返回表示式為null的函式
coalesce(expr)函式
返回列表中第一個不為null的表示式,如果都為null,則返回null
SQL> select coalesce(null,'9',null,'b')a,coalesce(null,null,null,null)b from dual;
A B
- -
9
7.2 排除指定條件函式
lnnvl(condition)函式
返回滿足condition條件以外的資料,包含null的條件,一般放到where語句中
SQL> select * from productinfo;
ID PRODUCTCODE PRODUCTNAME QTY
---------- ----------- ------------------------------ ----------
1 1001 蘋果 100
1 1002 栗子 3
1 1004 香蕉 34
1 1004 西瓜 34
SQL> select * from productinfo where lnnvl(qty<100);
ID PRODUCTCODE PRODUCTNAME QTY
---------- ----------- ------------------------------ ----------
1 1001 蘋果 100
7.3 替換null值函式
nvl(expr1,expr2)函式
- 當expr1為null時,返回expr2的值
- 當expr1不為null時,返回expr1的值
SQL> select * from productinfo;
ID PRODUCTCODE PRODUCTNAME QTY
---------- ----------- ------------------------------ ----------
1 1001 蘋果
1 1002 栗子 3
1 1004 香蕉 34
1 1004 西瓜 34
SQL> select id,productcode,productname, nvl(qty,0) qty from productinfo;
ID PRODUCTCODE PRODUCTNAME QTY
---------- ----------- ------------------------------ ----------
1 1001 蘋果 0
1 1002 栗子 3
1 1004 香蕉 34
1 1004 西瓜 34
nvl2(expr1,expr2,expr3)
- 當expr1為null時,返回expr3
- 當expr1不為null時,返回expr2
SQL> select * from productinfo;
ID PRODUCTCODE PRODUCTNAME QTY
---------- ----------- ------------------------------ ----------
1 1001 蘋果
1 1002 栗子 3
1 1004 香蕉 34
1 1004 西瓜 34
SQL> select id,productcode,productname, nvl2(qty,55,0) qty from productinfo;
ID PRODUCTCODE PRODUCTNAME QTY
---------- ----------- ------------------------------ ----------
1 1001 蘋果 0
1 1002 栗子 55
1 1004 香蕉 55
1 1004 西瓜 55
8 聚合函式
8.1 求平均值函式
avg(expr)函式
該函式可以求指定列的平均值
SQL> select * from productinfo;
ID PRODUCTCODE PRODUCTNAME QTY
---------- ----------- ------------------------------ ----------
1 1001 蘋果
1 1002 栗子 3
1 1004 香蕉 34
1 1004 西瓜 34
SQL> select avg(qty) from productinfo;
AVG(QTY)
----------
23.6666666
8.2 求記錄數函式
count(expr)
SQL> select * from productinfo;
ID PRODUCTCODE PRODUCTNAME QTY
---------- ----------- ------------------------------ ----------
1 1001 蘋果
1 1002 栗子 3
1 1004 香蕉 34
1 1004 西瓜 34
SQL> select count(1) from productinfo;
COUNT(1)
----------
4
8.3 求最大值函式
max(expr)
SQL> select * from productinfo;
ID PRODUCTCODE PRODUCTNAME QTY
---------- ----------- ------------------------------ ----------
1 1001 蘋果
1 1002 栗子 3
1 1004 香蕉 34
1 1004 西瓜 34
SQL> select max(qty) from productinfo;
MAX(QTY)
----------
34
8.4 求最小值
min(expr)
SQL> select * from productinfo;
ID PRODUCTCODE PRODUCTNAME QTY
---------- ----------- ------------------------------ ----------
1 1001 蘋果
1 1002 栗子 3
1 1004 香蕉 34
1 1004 西瓜 34
SQL> select min(qty) from productinfo;
MIN(QTY)
----------
3
8.5 求和函式
sum(expr)
SQL> select * from productinfo;
ID PRODUCTCODE PRODUCTNAME QTY
---------- ----------- ------------------------------ ----------
1 1001 蘋果
1 1002 栗子 3
1 1004 香蕉 34
1 1004 西瓜 34
SQL> select sum(qty) from productinfo;
SUM(QTY)
----------
71
9 其他函式
decode(expr,search,result,defalut)函式
當expr滿足search時候返回result,改過程可以重複多個,如果都沒有匹配的結果則返回default
SQL> select t.*, decode(qty,null,'不足',3,'不足','充足')a from productinfo t;
ID PRODUCTCODE PRODUCTNAME QTY A
---------- ----------- ------------------------------ ---------- ----
1 1001 蘋果 不足
1 1002 栗子 3 不足
1 1004 香蕉 34 充足
1 1004 西瓜 34 充足