1 2 3 4

内置函数

1常用函数汇总

定义,封装好一段代码,会返回指定的结果

数值型函数

序号 数值型函数 描述
1 abs(x) 绝对值
2 sign(x) 正负值
3 ceil(x) 返回大于等于x的最小整数值
4 floor(x) 返回小于等于x的最大整数值
5 power(x,y) 返回x的y次幂
6 log(x,y) 返回以x为底的y的对数,即log(底,数值)
7 mod(x,y) 取余
8 round(x[y]) 返回按精度y四舍五入后的值
9 trunc(x[y]) 返回按精度y截取后的值
10 sqrt(x) 返回x的平方根
11 greatest 获取集合或者表中多行中的最大值
12 least 获取集合或者表中多行中的最小值
字符型函数
序号 字符型函数 描述
1 ascii(c) 返回ascii码值
2 chr(c) 返回ascii码值对应的字符
3 || 拼接字符串
4 concat(c1,c2) 拼接字符串
5 distinct 去重
6 initcap(c1) 首字母大写
7 lower(c1) 全部转为小写
8 upper(c1) 全部转为大写
9 instr(c1,c2,[ i [ j ]]) 返回搜索字符串的指定位置
10 length(c1) 返回字符串的长度
11 lpad(c1,n[,c2]) 在字符串的左边填充字符串
12 rpad(c1,n[,c2]) 在字符串的右边填充字符串
13 ltrim(c1[,c2]) 删除左边字符串
14 rtrim(c1[,c2]) 删除右边字符串
15 trim(c1 from c2) 删除左边和右边出现的字符串
16 substr(c1,n1[,n2]) 截取字符串
17 replace(c1,c2,c3) 替换函数
18 translate(c1,c2,c3) 替换字符串
19 nvl(c1,c2) 若第一个参数为空,则返回第二个参数
20 nvl2(c1,c2,c3) 若第一个参数为空,则返回第三个参数,否则返回参数2
21 decode(c1,k1,v1,k2,v2,...,v3) c1等于k1返回v1,以此类推,否则返回v3
22 regexp_substr 字符串截取函数

日期函数

序号 日期函数 描述
1 sysdate 返回当前系统日期
2 add_months(d1,n1) 返回在原有日期上加n个月后的日期
3 last_day(d1) 返回d1所在月份最后一天的日期
4 months_between(d1,d2) 返回日期d1到日期d2之间的月数
5 round(d1[,c1]) 返回d1按c1四舍五入后期间的第一天日期
6 trunc(d1[,c1]) 返回d1在c1期间的第一天日期
7 next_day(d1[,c1]) 从特定日期得到未来第一个星期几的日期
8 extract(c1 from d1) 提取时间日期中的数据
9 dbtimezone 返回数据库时区
10 sessiontimezone 返回当前会话时区
11 interval c1 set1 变动日期时间数值

转换函数

序号 转换函数 描述
1 to_date 将字符串转化为时间
2 to_char 将时间或者数字转化为字符串
3 to_number 将字符串转化为数字

数值型函数

1abs(x)绝对值

SQL> select abs(100),abs(-100) from dual;

  ABS(100)  ABS(-100)
---------- ----------
       100        100

2sign(x)正负值

SQL> select sign(100),sign(-100),sign(0) from dual;

 SIGN(100) SIGN(-100)    SIGN(0)
---------- ---------- ----------
         1         -1          0

3ceil(x)返回大于等于x的最小整数值

SQL> select ceil(3.6),ceil(2.8+1.3),ceil(0),ceil(-3.6)
  2  from dual;

 CEIL(3.6) CEIL(2.8+1.3)    CEIL(0) CEIL(-3.6)
---------- ------------- ---------- ----------
         4             5          0         -3

4floor(x)返回小于等于x的最大整数值

SQL> select floor(3.6),floor(2.8+1.3),floor(0),floor(-3.6)
  2  from dual;

FLOOR(3.6) FLOOR(2.8+1.3)   FLOOR(0) FLOOR(-3.6)
---------- -------------- ---------- -----------
         3              4          0          -4

5power(x,y)返回x的y次幂

SQL> select power(2.5,2),power(2.5,-2),power(2.5,0),power(10,2)
  2  from dual;

POWER(2.5,2) POWER(2.5,-2) POWER(2.5,0) POWER(10,2)
------------ ------------- ------------ -----------
        6.25           .16            1         100

6log(x,y)返回以x为底的y的对数,即log(底,数值)

SQL> select log(2.5,6.25),log(2.5,0.16),log(2.5,1),log(10,100)
  2  from dual;

LOG(2.5,6.25) LOG(2.5,0.16) LOG(2.5,1) LOG(10,100)
------------- ------------- ---------- -----------
            2            -2          0           2

7mod(x,y)取余

SQL> select mod(18,5),mod(25,4) from dual;

 MOD(18,5)  MOD(25,4)
---------- ----------
         3          1

8round(x[y])返回按精度y四舍五入后的值

SQL> select round(5555.6666,2.6),
  2  round(5555.6666,-2.6),
  3  round(5555.6666,3),
  4  round(5555.6666)
  5  from dual;

ROUND(5555.6666,2.6) ROUND(5555.6666,-2.6) ROUND(5555.6666,3) ROUND(5555.6666)
------------- ----------- ------------- ---------
    5555.67       5600      5555.667      5556

9trunc(x[y])返回按精度y截取后的值

SQL> select trunc(5555.6666,2.6),
  2  trunc(5555.6666,-2.6),
  3  trunc(5555.6666,3),
  4  trunc(5555.6666)
  5  from dual;

TRUNC(5555.6666,2.6) TRUNC(5555.6666,-2.6) TRUNC(5555.6666,3) TRUNC(5555.6666)
-------------------- --------------------- ------------------ ----------------
             5555.66                  5500           5555.666             5555

10sqrt(x)返回x的平方根

SQL> select sqrt(10),sqrt(25),sqrt(9)
  2  from dual;

  SQRT(10)   SQRT(25)    SQRT(9)
---------- ---------- ----------
3.16227766          5          3

11greatest 获取集合或者表中多行中的最大值

SQL> select greatest(9,10,5) from dual;
GREATEST(9,10,5)
----------------
              10
SQL> select * from scs;
         ID NAME              C    M    E
----------- ----------- ---- ---- ----
          1 张三              80   90   73
          2 李四              82   60   93
          3 王五              87   94   98
          4 赵六              34   30   60
SQL> select name,c,m,e,greatest(c,m,e) from scs;

NAME          C    M    E GREATEST(C,M,E)
------- ---- ---- ---- ---------------
张三         80   90   73              90
李四         82   60   93              93
王五         87   94   98              98
赵六         34   30   60              60

12least 获取集合或者表中多行中的最小值

SQL> select least(9,10,5) from dual;
LEAST(9,10,5)
-------------
            5
SQL> select name,c,m,e,least(c,m,e) from scs;
NAME             C    M    E LEAST(C,M,E)
------------- ---- ---- ---- ------------
张三             80   90   73           73
李四             82   60   93           60
王五             87   94   98           87
赵六             34   30   60           30

字符型函数

1ascii(c)返回ascii码值

SQL> select ascii('A'),ascii('a'),ascii('1')
  2  from dual;

ASCII('A') ASCII('A') ASCII('1')
---------- ---------- ----------
        65         97         49

2chr(c)返回ascii码值对应的字符

SQL> select chr(65),chr(97),chr(49)
  2  from dual;

CH CH CH
-- -- --
A  a  1

3||拼接字符串

SQL> select empno||ename
  2  from emp;

EMPNO||ENAME
---------------
7777S_HH%GGH
7369SMITH
7499ALLEN
7521WARD

4concat(c1,c2)拼接字符串

SQL> select concat(empno,ename) from emp;

CONCAT(EMPNO,ENAME)
--------------------------------------------------------------------------------
7777S_HH%GGH
7369SMITH
7499ALLEN
7521WARD
7566JONES

5distinct去重

SQL> select distinct deptno from emp;

    DEPTNO
----------
        30
        20
        10

6initcap(c1)首字母大写

SQL> select initcap(ename) from emp;

INITCAP(ENAME)
--------------------
S_Hh%Ggh
Smith
Allen
Ward
Jones

7lower(c1)全部转为小写

SQL> select lower(ename) from emp;

LOWER(ENAME)
--------------------
s_hh%ggh
smith
allen
ward
jones

8upper(c1)全部转为大写

SQL> select upper(ename) from emp;

UPPER(ENAME)
--------------------
S_HH%GGH
SMITH
ALLEN
WARD
JONES

9instr(c1,c2,[ i [ j ]])返回搜索字符串的指定位置

  • I ,  搜索的开始位置,默认为1
  • J ,  第J次出现的位置,默认为1
SQL> select instr('oracle rraning','ra') instr from dual;

     INSTR
----------
         2
SQL> select instr('oracle rraning','ra',1,2) instr from dual;

     INSTR
----------
         9

10length(c1)返回字符串的长度

SQL> select ename,length(ename)
  2  from emp;

ENAME                LENGTH(ENAME)
-------------------- -------------
S_HH%GGH                         8
SMITH                            5
ALLEN                            5
WARD                             4
JONES                            5

11lpad(c1,n[,c2])在字符串的左边填充字符串

  • c1 字符串
  • n 追加后字符总长度
  • c2 追加字符串,默认为空格
    -----
  • 如果c1长度大于n,则返回c1左边n个字符
  • 如果c1长度小于n,且c2和c1连接后大于n,则返回连接后边n个字符
SQL> select lpad(ename,10,'*?') one,
  2  lpad(ename,5,'*?') two,
  3  lpad(ename,10,'!@#$%^&*()_+') three
  4  from emp;
  
ONE                    TWO                            THREE

*?S_HH%GGH           S_HH%                         !@S_HH%GGH
*?*?*SMITH             SMITH                           !@#$%SMITH
*?*?*ALLEN             ALLEN                           !@#$%ALLEN
*?*?*?WARD           *WARD                           !@#$%^WARD
*?*?*JONES             JONES                          !@#$%JONES

12rpad(c1,n[,c2])在字符串的右边填充字符串

  • 如果c1长度大于n,则返回c2左边n个字符
  • 如果c1长度小于n,c1和c2连接后大于n ,则返回连接后的左边n个字符
  • 如果c1长度小于n,c1和c2连接后大于n,则返回c1与多个重复的c2连接(总长度>=n)后的左边n个字符

在字符串'gao'的左边和右边分别加7个6

SQL> select lpad(rpad('gao',10,'6666666'),17,'6666666') text
  2  from dual;

TEXT
----------------------------------
6666666gao6666666
SQL> select rpad(lpad('gao',10,'6666666'),17,'6666666') text
  2  from dual;

TEXT
----------------------------------
6666666gao6666666

13ltrim(c1[,c2])删除左边字符串

SQL> select ltrim('  qing dao shi'),
  2         length(ltrim('  qing dao shi')),
  3         ltrim('qing dao shi','qing dao '),
  4         length(ltrim('qing dao shi','qing dao '))
  5  from dual;
 ------ -------------------------------------
qing dao shi       12        shi          3

14rtrim(c1[,c2])删除右边字符串

SQL> select rtrim('qing dao shi  '),
  2         length(rtrim('qing dao shi  '))
  3  from dual;

RTRIM('QINGDAOSHI')      LENGTH(RTRIM('QINGDAOSHI'))
------------------------ ---------------------------
qing dao shi                                      12

15trim(c1 from c2)删除左边和右边出现的字符串

SQL> select trim('  qing dao shi  '),
  2         length(trim('  qing dao shi  '))
  3  from dual;

TRIM('QINGDAOSHI')       LENGTH(TRIM('QINGDAOSHI'))
------------------------ --------------------------
qing dao shi                                     12

16substr(c1,n1[,n2])截取字符串

在字符表达式c1里,从n1开始截取n2个字符;若不指定n2则截取从第y个字符指导结束的字符

SQL> select substr('20191029',1,4),
  2         substr('20191029',5)
  3  from dual;

SUBSTR(' SUBSTR('
-------- --------
2019     1029

17replace(c1,c2,c3)替换函数

SQL> select replace('i love you','i','he'),
  2         replace('i love you','i ')
  3  from dual;

REPLACE('ILOVEYOU','I' REPLACE('ILOVEYO
---------------------- ----------------
he love you            love you

18translate(c1,c2,c3)替换字符串

  • 如果c3长度大于c2,则c3后面长处的字符无效
  • 如果c3长度小于c2,则c2后面长处的字符均替换为空(删除)
  • 如果c3长度为0,则返回空字符串
  • 如果c2里字符重复,按首次位置为替换依据
SQL> select translate('he love you','he','i'),
  2         translate('he love you','o','i')
  3  from dual;

TRANSLATE('HELOVEY TRANSLATE('HELOVEYOU',
------------------ ----------------------
i lov you          he live yiu

19nvl(c1,c2)若第一个参数为空,则返回第二个参数

  • 2个参数,若第一个参数为空,则返回第二个参数
SQL> select empno,
  2         comm,
  3         nvl(a.comm,1)
  4  from emp a where a.empno in(7499,7369);

     EMPNO       COMM NVL(A.COMM,1)
---------- ---------- -------------
      7369                        1
      7499        300           300

20nvl2(c1,c2,c3)若第一个参数为空,则返回第三个参数,否则返回参数2

  • 3个参数,若第一个参数为空,则返回参数3,否则返回参数2
SQL> select empno,
  2         comm,
  3         nvl2(a.comm,1,0)
  4  from emp a where a.empno in(7499,7369);

     EMPNO       COMM NVL2(A.COMM,1,0)
---------- ---------- ----------------
      7369                           0
      7499        300                1

21decode(c1,k1,v1,k2,v2,...,v3)c1等于k1返回v1,以此类推,否则返回v3

  • 多个参数,成对出现.若参数1的值等于参数2,则返回参数3,若参数1的值等于参数4,则返回参数5,以此类推
SQL> select sal, decode(a.sal, 800, 1, 950, 2, 1100, 3, 1250, 4, 1300, 5, 6)
  2  from emp a
  3  where a.sal > 0
  4  order by a.sal asc;

       SAL DECODE(A.SAL,800,1,950,2,1100,3,1250,4,1300,5,6)
---------- ------------------------------------------------
       800                                                1
       950                                                2
      1100                                                3
      1250                                                4
      1250                                                4
      1300                                                5
      1500                                                6
      1600                                                6

22regexp_substr():字符串截取函数

语法

regexp_substr(字符串,正则表达式,起始位置,第几个)
select regexp_substr('HELL,OQEE,EQ,QEQM','[^,]+',1,1) from dual;

输出
HELL

select regexp_substr('HELL,OQEE,EQ,QEQM','[^,]+',1,3) from dual;

输出
EQ

日期函数

1sysdate返回当前系统日期

SQL> select sysdate time
  2  from dual;

TIME
--------------
11-11月-19

2add_months(d1,n1)返回在原有日期上加n个月后的日期

SQL> select sysdate,
  2         add_months(sysdate,2),
  3         add_months(sysdate,-2)
  4  from dual;

SYSDATE        ADD_MONTHS(SYS ADD_MONTHS(SYS
-------------- -------------- --------------
11-11月-19     11-1月 -20     11-9月 -19

3last_day(d1)返回d1所在月份最后一天的日期

SQL> select sysdate,
  2         last_day(sysdate)
  3  from dual;

SYSDATE        LAST_DAY(SYSDA
-------------- --------------
11-11月-19     30-11月-19

4months_between(d1,d2)返回日期d1到日期d2之间的月数

SQL> select sysdate,
  2         months_between(sysdate,to_date('2019-01-01','YYYY-MM-DD')) d2,
  3         months_between(sysdate,to_date('2020-01-01','YYYY-MM-DD')) d3
  4  from dual;

SYSDATE                D2         D3
-------------- ---------- ----------
11-11月-19      10.349319  -1.650681

5round(d1[,c1])返回d1按c1四舍五入后期间的第一天日期

c1对应的参数表

最近0点日期 参数c1或j
最近的星期日 day或者dy或者d
最近月初日期 month或者mon或者mm或者rm
最近季日期 q
最近年初日期 syear或者year或者yyyy或者yyy或者yy或者y(多个y表示精度)
最近世纪初日期 cc或者scc

SQL> select sysdate 当前日期,
  2       round(sysdate,'syear') 最近年初日期,
  3       round(sysdate,'q') 最近季度日期,
  4       round(sysdate,'month') 最近月初,
  5       round(sysdate) 最近0点
  6  from dual;

当前日期       最近年初日期   最近季度日期   最近月初       最近0点
-------------- -------------- -------------- -------------- --------------
11-11月-19     01-1月 -20     01-10月-19     01-11月-19     12-11月-19

6trunc(d1[,c1])返回d1在c1期间的第一天日期

SQL> select sysdate 当前日期,
  2         trunc(sysdate) 今天日期,
  3         trunc(sysdate,'day') 本周日,
  4         trunc(sysdate,'month') 本月初,
  5         trunc(sysdate,'q') 本季初,
  6         trunc(sysdate,'year') 本年初日期
  7  from dual;

当前日期       今天日期       本周日         本月初         本季初         本年初日期
-------------- -------------- -------------- -------------- -------------- --------------
11-11月-19     11-11月-19     10-11月-19     01-11月-19     01-10月-19     01-1月 -19

7next_day(d1[,c1])从特定日期得到未来第一个星期几的日期

SQL> select sysdate 当前日期,
  2         next_day(sysdate,'星期一') 未来第一个星期一,
  3         next_day(sysdate,'星期二') 未来第一个星期二,
  4         next_day(sysdate,'星期三') 未来第一个星期三,
  5         next_day(sysdate,'星期四') 未来第一个星期四,
  6         next_day(sysdate,'星期五') 未来第一个星期五,
  7         next_day(sysdate,'星期六') 未来第一个星期六,
  8         next_day(sysdate,'星期日') 未来第一个星期日
  9  from dual;
当前日期       未来第一个星期 未来第一个星期 未来第一个星期 
-------------- -------------- -------------- -------------- 
11-11月-19     18-11月-19     12-11月-19     13-11月-19    

未来第一个星期 未来第一个星期 未来第一个星期 未来第一个星期
 -------------- -------------- -------------- --------------
 14-11月-19     15-11月-19     16-11月-19     17-11月-19

8extract(c1 from d1)提取时间日期中的数据

SQL> select
  2       extract(hour from timestamp '2001-2-16 2:38:40 ' ) 小时,
  3       extract(minute from timestamp '2001-2-16 2:38:40 ' ) 分钟,
  4       extract(second from timestamp '2001-2-16 2:38:40 ' ) 秒,
  5       extract(DAY from timestamp '2001-2-16 2:38:40 ' ) 日,
  6       extract(MONTH from timestamp '2001-2-16 2:38:40 ' ) 月,
  7       extract(YEAR from timestamp '2001-2-16 2:38:40 ' ) 年
  8  from dual;

      小时       分钟         秒         日         月         年
---------- ---------- ---------- ---------- ---------- ----------
         2         38         40         16          2       2001
SQL> select sysdate 当前日期,
  2         extract(DAY from sysdate ) 日,
  3         extract(MONTH from sysdate ) 月,
  4         extract(YEAR from sysdate ) 年
  5  from dual;

当前日期               日         月         年
-------------- ---------- ---------- ----------
11-11月-19             11         11       2019

9dbtimezone返回数据库时区

SQL> select dbtimezone
  2  from dual;

DBTIMEZONE
------------
+00:00

10sessiontimezone返回当前会话时区

SQL> select dbtimezone,
  2         sessiontimezone
  3  from dual;

DBTIMEZONE   SESSIONTIMEZONE
------------ ------------
+00:00       +08:00

11interval c1 set1变动日期时间数值


SQL> select trunc(sysdate)+(interval '1' second) 加1秒,
  2         trunc(sysdate)+(interval '1' minute) 加1分钟,
  3         trunc(sysdate)+(interval '1' hour) 加1小时,
  4         trunc(sysdate)+(INTERVAL '1' DAY) 加1天,
  5         trunc(sysdate)+(INTERVAL '1' MONTH) 加1月,
  6         trunc(sysdate)+(INTERVAL '1' YEAR) 加1年,
  7         trunc(sysdate)+(interval '01:02:03' hour to second) 加指定小时到秒,
  8         trunc(sysdate)+(interval '01:02' minute to second) 加指定分钟到秒,
  9         trunc(sysdate)+(interval '01:02' hour to minute) 加指定小时到分钟,
 10         trunc(sysdate)+(interval '2 01:02' day to minute) 加指定天数到分钟
 11  from dual;

加1秒          加1分钟        加1小时        加1天          加1月          加1年 
11-11月-19     11-11月-19     11-11月-19     12-11月-19     11-12月-19     11-11月-20   

  加指定小时到秒 加指定分钟到秒 加指定小时到分 加指定天数到分
  11-11月-19     11-11月-19     11-11月-19     13-11月-19

转换函数

to_date将字符串转化为时间

SQL> select to_date('20191110','YYYYMMDD') from dual;

TO_DATE('20191
--------------
10-11月-19

to_char将时间或者数字转化为字符串

SQL> select to_char(sysdate,'YYYYMMDD') from dual;

TO_CHAR(SYSDATE,
----------------
20191111

to_number将字符串转化为数字

SQL> select to_number('123') from dual;

TO_NUMBER('123')
----------------
             123
posted @ 2019-11-04 20:23  多走多看  阅读(392)  评论(1编辑  收藏  举报