工作中,Oracle常用函数

打印 上一主题 下一主题

主题 887|帖子 887|积分 2661

目录

1、序言

Oracle提供了不少内置函数,熟练使用这些函数,可以大大提高我们工作效率。函数可以接受0个或多个入参,并返回一个输出结果。
2、Oracle函数分类

Oracle函数分为单行函数和聚合函数

  • 单行函数:对每一个函数应用在表的记录中时,只能输入一行结果,返回一个结果。
    常见的单行函数有如下四种
    ① 数值型函数:对数字进行计算,返回一个数字。
    ②字符函数:对字符串操作。
    ③转换函数:可以将一种数据类型转换为另外一种数据类型。
    ④日期函数:对日期和时间进行处理。
    ⑤ null函数:处理null值的相关函数
  • 聚合函数:聚合函数同时可以对多行数据进行操作,并返回一个结果。
3、数值型函数

3.1 求绝对值函数

abs(n)函数
用于返回绝对值
  1. SQL> select abs(10),abs(-10),abs('100') from dual;
  2.    ABS(10)   ABS(-10) ABS('100')
  3. ---------- ---------- ----------
  4.         10         10        100
复制代码
3.2 求余函数

mod(n2,n1)
返回n2除以n1的余数
  1. SQL> select mod(5,2),mod(8/3,3),mod('10',2),mod(-10,6),mod(3,0) from dual;
  2.   MOD(5,2) MOD(8/3,3) MOD('10',2) MOD(-10,6)   MOD(3,0)
  3. ---------- ---------- ----------- ---------- ----------
  4.          1 2.66666666           0         -4          3
复制代码
3.3 判断数值正负函数

sign(n) 函数
n为正返回1,n为0返回0,n为负返回-1
  1. SQL> select sign(-2),sign(2),sign(0.0),sign(-3*2) from dual;
  2.   SIGN(-2)    SIGN(2)  SIGN(0.0) SIGN(-3*2)
  3. ---------- ---------- ---------- ----------
  4.         -1          1          0         -1
复制代码
3.4 三角函数

cos(n):返回余弦值 acos(n):返回反余弦值 sin(n):返回正弦值 asin(n) tan(n):返回正切值 atan(n):返回反正切值
  1. SQL> select cos(3.1415926),acos(1),sin(0.5),asin(1),tan(1),atan(1) from dual;
  2. COS(3.1415926)    ACOS(1)   SIN(0.5)    ASIN(1)     TAN(1)    ATAN(1)
  3. -------------- ---------- ---------- ---------- ---------- ----------
  4. -0.99999999999          0 0.47942553 1.57079632 1.55740772 0.78539816
复制代码
3.5 返回以指定数值为准整数的函数

ceil(n)函数
返回大于等于n的最小整数
  1. SQL> select ceil(15),ceil(15.6),ceil(-10.2),ceil('10.2') from dual;
  2.   CEIL(15) CEIL(15.6) CEIL(-10.2) CEIL('10.2')
  3. ---------- ---------- ----------- ------------
  4.         15         16         -10           11
复制代码
floor(n)函数
返回小于或等于n的最大整数
  1. SQL> select floor(15),floor(15.6),floor(-10.2),floor('10.2') from dual;
  2. FLOOR(15) FLOOR(15.6) FLOOR(-10.2) FLOOR('10.2')
  3. ---------- ----------- ------------ -------------
  4.         15          15          -11            10
复制代码
3.6 指数、对数函数

sqrt(n)函数
返回n的平方根
  1. SQL> select sqrt(4),sqrt('8.9') from dual;
  2.    SQRT(4) SQRT('8.9')
  3. ---------- -----------
  4.          2 2.983286778
复制代码
power(n1,n2)函数
返回n1的n2次幂
  1. SQL> select power(3,2),power('4',2),power(2.5,4),power(-5,2)from dual;
  2. POWER(3,2) POWER('4',2) POWER(2.5,4) POWER(-5,2)
  3. ---------- ------------ ------------ -----------
  4.          9           16      39.0625          25
复制代码
log(n1,n2)
返回以n1为底n2的对数
  1. SQL> select log(10,100),log(2.4,'10') from dual;
  2. LOG(10,100) LOG(2.4,'10')
  3. ----------- -------------
  4.           2 2.63011686739
复制代码
3.7 四舍五入函数

round(x[,y]) 函数

  • 会四舍五入。在缺省 y 时,默认 y=0;
  • y 是正整数,就是四舍五入到小数点后 y 位;
  • y 是负整数,四舍五入到小数点左边|y|位
  1. SQL> select round(3.564),round(3.456,2),round(3456.345,-2) from dual;
  2. ROUND(3.564) ROUND(3.456,2) ROUND(3456.345,-2)
  3. ------------ -------------- ------------------
  4.            4           3.46               3500
复制代码
trunc(x[,y])函数

  • 直接截取,不四舍五入。在缺省 y 时,默认 y=0;
  • Y是正整数,就是四舍五入到小数点后 y位;
  • y 是负整数,四舍五入到小数点左边|y|位。
  1. SQL> select trunc(3.564),trunc(3.456,2),trunc(3456.345,-2) from dual;
  2. TRUNC(3.564) TRUNC(3.456,2) TRUNC(3456.345,-2)
  3. ------------ -------------- ------------------
  4.            3           3.45               3400
复制代码
4 字符型函数

4.1 ASSCII与字符转换函数

ASSCII(x) 函数
返回字符x首字母的ASSCII值
  1. SQL> select ascii('荣'),ascii('Xiezhr'),ascii('xiezhr') from dual;
  2. ASCII('荣') ASCII('XIEZHR') ASCII('XIEZHR')
  3. ----------- --------------- ---------------
  4.       51417              88             120
复制代码
chr(n)函数
与ASSCII函数相反,将ASSCII码转换为字符
  1. SQL> select chr(51417),chr(88),chr(120) from dual;
  2. CHR(51417) CHR(88) CHR(120)
  3. ---------- ------- --------
  4. 荣         X       x
复制代码
4.2 获取字符串长度

length(string)
返回string所占的字节长度,单位是字节
  1. SQL> select length('公众号XiezhrSpace') from dual;
  2.    LENGTH('公众号XIEZHRSPACE')
  3. ---------------------------
  4.                          14
复制代码
lengthb(string)
返回string所占的字符长度,单位是字符
  1. SQL> select lengthb('公众号XiezhrSpace') from dual;
  2.    LENGTHB('公众号XIEZHRSPACE')
  3. ----------------------------
  4.                           17
复制代码
注意:上面例子,字符串是统一个,但是两个函数返回的值是不一样的。所以可以根据length(‘string’)=lengthb(‘string’)判断字符串是否含有中文
4.3 字符串截取函数


  • substr(x,start[,length])
  • 从start处开始,截取length个字符;
  • 缺省length,默认到结尾;
  • length为正,从左边截取;
  • length为负从右边截取
  1. SQL> select substr('公众号XiezhrSpace',4) a,substr('公众号XiezhrSpace',4,11) b,substr('公众号XiezhrSpace',-11,11) c from dual;
  2. A           B           C
  3. ----------- ----------- -----------
  4. XiezhrSpace XiezhrSpace XiezhrSpace
复制代码

  • substrb(x,start[,length])
函数与substr不同之处是按照字节截取
  1. SQL> select substrb('公众号XiezhrSpace',7) a,substrb('公众号XiezhrSpace',7,17) b,substrb('公众号XiezhrSpace',-11,11) c from dual;
  2. A           B           C
  3. ----------- ----------- -----------
  4. XiezhrSpace XiezhrSpace XiezhrSpace
复制代码
还有几个截取函数,但是不常用

  • substrc 以Unicode字符为单位截取
  • substr4 以UCS4代码点位单位
  • substr2 以UCS2代码点位单位
4.4 字符串连接函数

concat(x,y)

  • 效果和“||”连接一样,将字符串x和y连接起来
  1. SQL> select concat('公众号','XiezhrSpace'),'公众号'||'XiezhrSpace' from dual;
  2. CONCAT('公众号','XIEZHRSPACE') '公众号'||'XIEZHRSPACE'
  3. ------------------------------ -----------------------
  4. 公众号XiezhrSpace              公众号XiezhrSpace
复制代码
4.5 字符串搜索函数


  • instr( string1, string2 [, start_position [, n ] ] )
  • 从start_position开始,目标字符串string2在源字符串string1中出现第n次的位置;
  • start_position为正表示从string1左边开始,为负表示从string1右边开始;
  • start_position、n可以去掉,表示string2在string1第一次出现位置
  1. SQL> select instr('公众号XiezhrSpace','Xiezhr') a,instr('公众号XiezhrSpace','xiezhr') b,instr('公众号XiezhrSpace','Xiezhr',2,1) c,instr('公众号XiezhrSpace','Xiezhr',-1,1) d from dual;
  2.          A          B          C          D
  3. ---------- ---------- ---------- ----------
  4.          4          0          4          4
复制代码

  • instrb( string1, string2 [, start_position [, n ] ] )
以字节为单位搜索
  1. SQL> select instrb('公众号XiezhrSpace','Xiezhr') a,instrb('公众号XiezhrSpace','xiezhr') b,instrb('公众号XiezhrSpace','Xiezhr',2,1) c,instrb('公众号XiezhrSpace','Xiezhr',-1,1) d from dual;
  2.          A          B          C          D
  3. ---------- ---------- ---------- ----------
  4.          7          0          7          7
复制代码
跟字符串截取函数一样,还有几个搜索函数

  • instrc 以Unicode字符为单位截取
  • instr4 以UCS4代码点位单位
  • instr2 以UCS2代码点位单位
4.6 字母大小写转换函数


  • upper(n)函数
将字符串n全部转换为大写
  1. SQL>  select upper('xiezhrspace'),upper('x') from dual;
  2. UPPER('XIEZHRSPACE') UPPER('X')
  3. -------------------- ----------
  4. XIEZHRSPACE          X
复制代码

  • lower(n)函数
将字符串n全部转换为小写
  1. SQL> select lower('X'),lower('XIEZHRSPACE') from dual;
  2. LOWER('X') LOWER('XIEZHRSPACE')
  3. ---------- --------------------
  4. x          xiezhrspace
复制代码
4.7 字符串替换函数

replace(char,search_string[,replacement_string])

  • char是目标字符串
  • earch_string是要替换的字符串
  • replacement_string参数可选,用它替换被搜索到的字符串,如果参数不用表示从char中删除earch_string字符串**
  1. SQL> select replace('公众号XiezhrSpace','公众号','公众号:')a,replace('公众号XiezhrSpace','公众号')b from dual;
  2. A                  B
  3. ------------------ -----------
  4. 公众号:XiezhrSpace XiezhrSpace
复制代码
4.8 字符串填充函数


  • **rpad(exp1,n[,exp2]) **
在字符串exp1右边用字符串exp2填充,直到整个字符串长度为n为止;如果exp2参数没有,则以空格填充
  1. SQL> select rpad('xiezhr',10,'0'),rpad('xiezhr',10) from dual;
  2. RPAD('XIEZHR',10,'0') RPAD('XIEZHR',10)
  3. --------------------- -----------------
  4. xiezhr0000            xiezhr
复制代码

  • lpad(exp1,n[,exp2])
在字符串exp1左边用字符串exp2填充,直到整个字符串长度为n为止;如果exp2参数没有,则以空格填充
  1. SQL> select lpad('xiezhr',10,'0'),lpad('xiezhr',10) from dual;
  2. LPAD('XIEZHR',10,'0') LPAD('XIEZHR',10)
  3. --------------------- -----------------
  4. 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:被操作字符串
  1. SQL> select trim(trailing '公' from '公众号XiezhrSpace公') as a ,trim(leading '我' from '我公众号XiezhrSpace')as b ,trim('  公众号XiezhrSpace  ')as c from dual;
  2. A                 B                 C
  3. ----------------- ----------------- -----------------
  4. 公众号XiezhrSpace 公众号XiezhrSpace 公众号XiezhrSpace
复制代码
rtrim(char[,str])函数
与rpad函数相反,将char右边出现在str中的字符删掉,str参数不叫则默认删除空格
  1. SQL> select rtrim('公众号XiezhrSpace我的','我的') a,'公众号XiezhrSpace  ' b from dual;
  2. A                 B
  3. ----------------- -------------------
  4. 公众号XiezhrSpace 公众号XiezhrSpace
复制代码
ltrim(char[,str])函数
将char右边出现在str中的字符删掉,str参数不叫则默认删除空格
  1. SQL> select ltrim('我的公众号XiezhrSpace','我的') a ,'   公众号XiezhrSpace' b from dual;
  2. A                 B
  3. ----------------- --------------------
  4. 公众号XiezhrSpace    公众号XiezhrSpace
复制代码
5 日期型函数

5.1 系统时区、日期、时间函数

dbtimezone函数
函数没有参数,返回数据库时区
  1. SQL> select dbtimezone from dual;
  2. DBTIMEZONE
  3. ----------
  4. +00:00
复制代码
sysdate函数
函数没有参数,可以得到系统当前日期
  1. SQL> select sysdate from dual;
  2. SYSDATE
  3. -----------
  4. 2021-02-27
复制代码
systimestamp函数
函数没有参数,返回系统时间。时间包含时区信息,精确到微秒。函数可以用于返回远端数据库服务器时间
  1. SQL> select systimestamp from dual;
  2. SYSTIMESTAMP
  3. --------------------------------------------------------------------------------
  4. 27-2月 -21 03.06.44.403049 下午 +08:00
复制代码
5.2 为日期加上指定月份函数

add_months(date,i)函数

  • date:指定日期
  • i: 要加的月份。i为正,在date日期上加i月;i为负,在date日期上减i月
  1. 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;
  2. A           B
  3. ----------- -----------
  4. 2021-11-01  2020-03-01
复制代码
5.3 返回指定月份最后一天

last_day(date)函数
返回date日期的最后一天
  1. SQL> select last_day(to_date('2020-01-01','yyyy-mm-dd')) a from dual;
  2. A
  3. -----------
  4. 2020-01-31
复制代码
5.4 返回指定日期后一周的函数

next_day(date,char)函数
  1. SQL> select sysdate, next_day(sysdate,'星期二') a from dual;
  2. SYSDATE     A
  3. ----------- -----------
  4. 2021-02-27  2021-03-02
复制代码
5.5 提取指定日期特定部分函数

extract(datetime)函数
从给定的datetime中得到年、月、日、时、分、秒
  1. SQL> select sysdate "date",
  2.   2         extract(year from sysdate)"year",
  3.   3         extract(month from sysdate)"month",
  4.   4         extract(day from sysdate)"day",
  5.   5         extract(hour from systimestamp)"hour",
  6.   6         extract(minute from systimestamp)"minute",
  7.   7         extract(second from systimestamp)"second"
  8.   8  from dual;
  9. date              year      month        day       hour     minute     second
  10. ----------- ---------- ---------- ---------- ---------- ---------- ----------
  11. 2021-02-27        2021          2         27          7         25    3.72008
复制代码
5.6 获取两个日期之间月份

month_between(date1,date2)
获取data1,date2日期之间的月份
  1. SQL> select months_between(to_date('2021-03-02','yyyy-mm-dd'),to_date('2020-01-02','yyyy-mm-dd')) a from dual;
  2.          A
  3. ----------
  4.         14
复制代码
5.7 日期四舍五入、截取函数

ronud(date[,fmt])
将date舍入到fmt指定形式,如果fmt参数不加,date被处理到最近一天
  1. SQL> select round(to_date('2020-01-03 21:00:00', 'yyyy-mm-dd hh24:mi:ss'),'month') a,
  2.   2         round(to_date('2020-01-03 21:00:00', 'yyyy-mm-dd hh24:mi:ss'),'day') b,
  3.   3         round(to_date('2020-01-03 21:00:00', 'yyyy-mm-dd hh24:mi:ss')) c
  4.   4    from dual;
  5. A           B           C
  6. ----------- ----------- -----------
  7. 2020-01-01  2020-01-05  2020-01-04
复制代码
trunc(date[,fmt])
将date截取到fmt指定形式,如果fmt参数不加,date被处理到最近一天
  1. SQL> select trunc(to_date('2020-01-03 21:00:00', 'yyyy-mm-dd hh24:mi:ss'),'month') a,
  2.   2         trunc(to_date('2020-01-03 21:00:00', 'yyyy-mm-dd hh24:mi:ss'),'day') b,
  3.   3         trunc(to_date('2020-01-03 21:00:00', 'yyyy-mm-dd hh24:mi:ss')) c
  4.   4    from dual;
  5. A           B           C
  6. ----------- ----------- -----------
  7. 2020-01-01  2019-12-29  2020-01-03
复制代码
6 转换函数

6.1 数据类型转换函数

一般用于数字与字符、字符与日期之间转换
  1. SQL>   select cast(sysdate as varchar2(12)) a,cast('123' as number) b, cast(123 as varchar2(3)) c from dual;
  2. A                     B C
  3. ------------ ---------- ---
  4. 27-2月 -21          123 123
复制代码
6.2 将字符串转换字符集

convert(char,a[,b])函数

  • char:待转换的字符串
  • a:转变后的字符集
  • b: char原来字符集
  1. SQL> select convert('测试','US7ASCII','ZHS16GBK') a from dual;
  2. A
  3. ------------------------------
  4. ??
复制代码
6.3 数值转换成字符串

to_char(number[,fmt])函数
将数值、日期按照指定格式转换成字符串
  1. SQL> select to_char(3.45)a,to_char(3.45,'99.9')b,to_char(sysdate,'yyyy-mm-dd')c from dual;
  2. A    B     C
  3. ---- ----- ----------
  4. 3.45   3.5 2021-02-27
复制代码
6.4 字符转日期

to_date(char,fmt)函数
将字符按照fmt格式转换
  1. SQL> select to_date('2020-12-01','yyyy-mm-dd') a from dual;
  2. A
  3. -----------
  4. 2020-12-01
复制代码
6.5 符串转数字函数

to_number(char[,fmt])函数
将字符串char 转换为数值
  1. SQL> select to_number('34.562','9999.999') from dual;
  2. TO_NUMBER('34.562','9999.999')
  3. ------------------------------
  4.                         34.562
复制代码
7 null 函数

null值我们经常会遇到的,这时候我们就要学会怎么处理null值
7.1 返回表达式为null的函数

coalesce(expr)函数
返回列表中第一个不为null的表达式,如果都为null,则返回null
  1. SQL> select coalesce(null,'9',null,'b')a,coalesce(null,null,null,null)b from dual;
  2. A B
  3. - -
  4. 9
复制代码
7.2 排除指定条件函数

lnnvl(condition)函数
返回满足condition条件以外的数据,包含null的条件,一般放到where语句中
  1. SQL> select * from productinfo;
  2.         ID PRODUCTCODE PRODUCTNAME                           QTY
  3. ---------- ----------- ------------------------------ ----------
  4.          1 1001        苹果                                  100
  5.          1 1002        栗子                                    3
  6.          1 1004        香蕉                                   34
  7.          1 1004        西瓜                                   34
  8. SQL> select * from productinfo where lnnvl(qty<100);
  9.         ID PRODUCTCODE PRODUCTNAME                           QTY
  10. ---------- ----------- ------------------------------ ----------
  11.          1 1001        苹果                                  100
复制代码
nvl2(expr1,expr2,expr3)

  • 当expr1为null时,返回expr3
  • 当expr1不为null时,返回expr2
  1. SQL> select * from productinfo;
  2.         ID PRODUCTCODE PRODUCTNAME                           QTY
  3. ---------- ----------- ------------------------------ ----------
  4.          1 1001        苹果                           
  5.          1 1002        栗子                                    3
  6.          1 1004        香蕉                                   34
  7.          1 1004        西瓜                                   34
  8. SQL> select id,productcode,productname, nvl(qty,0) qty from productinfo;
  9.         ID PRODUCTCODE PRODUCTNAME                           QTY
  10. ---------- ----------- ------------------------------ ----------
  11.          1 1001        苹果                                    0
  12.          1 1002        栗子                                    3
  13.          1 1004        香蕉                                   34
  14.          1 1004        西瓜                                   34
复制代码
8 聚合函数

8.1 求平均值函数

avg(expr)函数
该函数可以求指定列的平均值
  1. SQL> select * from productinfo;
  2.         ID PRODUCTCODE PRODUCTNAME                           QTY
  3. ---------- ----------- ------------------------------ ----------
  4.          1 1001        苹果                           
  5.          1 1002        栗子                                    3
  6.          1 1004        香蕉                                   34
  7.          1 1004        西瓜                                   34
  8. SQL> select id,productcode,productname, nvl2(qty,55,0) qty from productinfo;
  9.         ID PRODUCTCODE PRODUCTNAME                           QTY
  10. ---------- ----------- ------------------------------ ----------
  11.          1 1001        苹果                                    0
  12.          1 1002        栗子                                   55
  13.          1 1004        香蕉                                   55
  14.          1 1004        西瓜                                   55
复制代码
8.2 求记录数函数

count(expr)
  1. SQL> select * from productinfo;
  2.         ID PRODUCTCODE PRODUCTNAME                           QTY
  3. ---------- ----------- ------------------------------ ----------
  4.          1 1001        苹果                           
  5.          1 1002        栗子                                    3
  6.          1 1004        香蕉                                   34
  7.          1 1004        西瓜                                   34
  8. SQL> select avg(qty) from productinfo;
  9.   AVG(QTY)
  10. ----------
  11. 23.6666666
复制代码
8.3 求最大值函数

max(expr)
  1. SQL> select * from productinfo;
  2.         ID PRODUCTCODE PRODUCTNAME                           QTY
  3. ---------- ----------- ------------------------------ ----------
  4.          1 1001        苹果                           
  5.          1 1002        栗子                                    3
  6.          1 1004        香蕉                                   34
  7.          1 1004        西瓜                                   34
  8. SQL> select count(1) from productinfo;
  9.   COUNT(1)
  10. ----------
  11.          4
复制代码
8.4 求最小值

min(expr)
  1. SQL> select * from productinfo;
  2.         ID PRODUCTCODE PRODUCTNAME                           QTY
  3. ---------- ----------- ------------------------------ ----------
  4.          1 1001        苹果                           
  5.          1 1002        栗子                                    3
  6.          1 1004        香蕉                                   34
  7.          1 1004        西瓜                                   34
  8. SQL> select max(qty) from productinfo;
  9.   MAX(QTY)
  10. ----------
  11.         34
复制代码
8.5 求和函数

sum(expr)
  1. SQL> select * from productinfo;
  2.         ID PRODUCTCODE PRODUCTNAME                           QTY
  3. ---------- ----------- ------------------------------ ----------
  4.          1 1001        苹果                           
  5.          1 1002        栗子                                    3
  6.          1 1004        香蕉                                   34
  7.          1 1004        西瓜                                   34
  8. SQL> select min(qty) from productinfo;
  9.   MIN(QTY)
  10. ----------
  11.          3
复制代码
9 其他函数

decode(expr,search,result,defalut)函数
当expr满足search时候返回result,改过程可以重复多个,如果都没有匹配的结果则返回default
  1. SQL> select * from productinfo;
  2.         ID PRODUCTCODE PRODUCTNAME                           QTY
  3. ---------- ----------- ------------------------------ ----------
  4.          1 1001        苹果                           
  5.          1 1002        栗子                                    3
  6.          1 1004        香蕉                                   34
  7.          1 1004        西瓜                                   34
  8. SQL> select sum(qty) from productinfo;
  9.   SUM(QTY)
  10. ----------
  11.         71
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

瑞星

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表