课程表

Oracle 基础教程

Oracle 进阶教程

Oracle PL/SQL

Oracle OEM

Oracle 备份和恢复

Oracle RAC

工具箱
速查手册

Oracle 函数

当前位置:免费教程 » 数据库/运维 » Oracle

Oracle SQL语句中经常使用到Oracle自带的函数,这些函数丰富了SQL的语言功能,为Oracle SQL提供了更多的操作性。Oracle函数可以接受零个或者多个输入参数,并返回一个输出结果。 Oracle 数据库中主要使用两种类型的函数:

1、单行函数:对每一个函数应用在表的记录中时,只能输入一行中的列值作为输入参数(或常数),并且返回一个结果。

例如1:MOD(X,Y) 是求余函数,返回的X除以Y的余数,其中X和Y可以是列值,也可以是常数。

例如2:TO_CHAR(X,'YYYYMMDD')是时间类型转字符串的函数,其中X可以是行中某一时间类型(date)的列,也可以是一个时间类型的常数。

常用的单行函数大致以下几类:

字符串函数:对字符串进行操作,例如:TO_CHAR()、SUBSTR()、DECODE()等等。

数值函数:对数值进行计算或操作,返回一个数字。例如:ABS()、MOD()、ROUND()等等。

转换函数:将一种数据类型转换成另外一种类型:例如:TO_CHAR()、TO_NUMBER()、TO_DATE()等等。

日期函数:对时间和日期进行操作的函数。例如:TRUNC()、SYSDATE()、ADD_MONTHS()等等。

2、聚合函数:聚合函数同时可以对多行数据进行操作,并返回一个结果。比如 SUM(x)返回结果集中 x 列的总合。


一、Oracle字符型函数

Oracle字符型函数是单行函数当中的一种,是用来处理字符串类型的函数,通过接收字符串参数,然后经过操作返回字符串结果的函数。

常用的函数如下表:


函数

说明

案例

结果

ASCII(X)

 求字符X的ASCII码

select ASCII('A') FROM DUAL; 

65

CHR(X)

 求ASCII码对应的字符

select CHR(65) FROM DUAL; 

'A'

LENGTH(X)

 求字符串X的长度

select LENGTH('ORACLE技术圈')from DUAL;

9

CONCATA(X,Y)

返回连接两个字符串X和Y的结果

select CONCAT('ORACLE','技术圈') from DUAL;

ORACLE技术圈

INSTR(X,Y[,START])

查找字符串X中字符串Y的位置,可以指定从Start位置开始搜索,不填默认从头开始

SELECT INSTR('ORACLE技术圈','技术') FROM DUAL;

7

LOWER(X)

把字符串X中大写字母转换为小写

SELECT LOWER('ORACLE技术圈') FROM DUAL;

oracle技术圈

UPPER(X)

把字符串X中小写字母转换为大写

SELECT UPPER('Oracle技术圈') FROM DUAL;

ORACLE技术圈

INITCAP(X)

把字符串X中所有单词首字母转换为大写,其余小写。

SELECT INITCAP('ORACLE is good ') FROM DUAL;

Oracle Is Good 

LTRIM(X[,Y])

去掉字符串X左边的Y字符串,Y不填时,默认的是字符串X左边去空格

SELECT LTRIM('--ORACLE技术圈','-') FROM DUAL;

ORACLE技术圈

RTRIM(X[,Y])

去掉字符串X右边的Y字符串,Y不填时,默认的是字符串X右边去空格

SELECT RTRIM('ORACLE技术圈--','-') FROM DUAL;

ORACLE技术圈

TRIM(X[,Y])

去掉字符串X两边的Y字符串,Y不填时,默认的是字符串X左右去空格

SELECT TRIM('--ORACLE技术圈--','-') FROM DUAL;

ORACLE技术圈

REPLACE(X,old,new)

查找字符串X中old字符,并利用new字符替换

SELECT REPLACE('ORACLE技术圈','技术圈','技术交流') FROM DUAL;

ORACLE技术交流

SUBSTR(X,start[,length])

截取字符串X,从start位置(其中start是从1开始)开始截取长度为length的字符串,length不填默认为截取到字符串X末尾

SELECT SUBSTR('ORACLE技术圈',1,6) FROM DUAL;

ORACLE

RPAD(X,length[,Y])

对字符串X进行右补字符Y使字符串长度达到length长度

SELECT RPAD('ORACLE',9,'-') from DUAL;

ORACLE---

LPAD(X,length[,Y])

对字符串X进行左补字符Y使字符串长度达到length长度

SELECT LPAD('ORACLE',9,'-') from DUAL;

---ORACLE


二、Oracle日期型函数

Oracle日期类型函数是操作日期、时间类型的相关数据,返回日期时间类型或数字类型结果,常用的函数有:SYSDATE()、ADD_MONTHS()、LAST_DAY()、TRUNC()、ROUND()等等。

1、系统日期、时间函数:

·SYSDATE函数:该函数没有参数,可以得到系统的当前时间。

案例代码:

  1. select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;

结果:

1.jpg

·SYSTIMESTAMP函数:该函数没有参数,可以得到系统的当前时间,该时间包含时区信息,精确到微秒。

案例代码:

  1. select systimestamp from dual;

结果:

2.jpg

2、数据库时区函数:

·DBTIMEZONE函数:该函数没有输入参数,返回数据库时区。

案例代码:

  1. select dbtimezone from dual;

结果:

3.jpg

3、给日期加上指定的月份函数:

ADD_MONTHS(r,n)函数:该函数返回在指定日期r上加上一个月份数n后的日期。其中

r:指定的日期。

n:要增加的月份数,如果N为负数,则表示减去的月份数。

案例代码:

  1. select to_char(add_months(to_date('2018-11-12','yyyy-mm-dd'),1),'yyyy-mm-dd'),
  2.        to_char(add_months(to_date('2018-10-31','yyyy-mm-dd'),1),'yyyy-mm-dd'),
  3.        to_char(add_months(to_date('2018-09-30','yyyy-mm-dd'),1),'yyyy-mm-dd')        
  4.   from dual;

结果:(如果指定的日期是月份的最后一天,返回的也是新的月份的最后一天,如果新的月份比指定的月份日期少,将会自动调回有效日期)

4.jpg

4、月份最后一天函数:

LAST_DAY(r)函数:返回指定r日期的当前月份的最后一天日期。

案例代码:

  1. select last_day(sysdate) from dual;

结果:

5.jpg

5、指定日期后一周的日期函数:

NEXT_DAY(r,c)函数:返回指定R日期的后一周的与r日期字符(c:表示星期几)对应的日期。

案例代码:

  1. select next_day(to_date('2018-11-12','yyyy-mm-dd'),'星期四') from dual;

结果:

6.jpg

6、返回指定日期中特定部分的函数:

EXTRACT(time)函数:返回指定time时间当中的年、月、日、分等日期部分。

案例代码:

  1. select  extract( year from timestamp '2018-11-12 15:36:01') as year,
  2.         extract( month from timestamp '2018-11-12 15:36:01') as month,        
  3.         extract( day from timestamp '2018-11-12 15:36:01') as day,  
  4.         extract( minute from timestamp '2018-11-12 15:36:01') as minute,
  5.         extract( second from timestamp '2018-11-12 15:36:01') as second
  6.  from dual;

结果:

7.jpg

7、返回两个日期间的月份数:

MONTHS_BETWEEN(r1,r2)函数:该函数返回r1日期和r2日期直接的月份。当r1>r2时,返回的是正数,假如r1和r2是不同月的同一天,则返回的是整数,否则返回的小数。当r1<r2时,返回的是负数。

案例代码:

  1. select months_between(to_date('2018-11-12', 'yyyy-mm-dd'),
  2.                       to_date('2017-11-12', 'yyyy-mm-dd')) as zs, --整数
  3.        months_between(to_date('2018-11-12', 'yyyy-mm-dd'),
  4.                       to_date('2017-10-11', 'yyyy-mm-dd')) as xs, --小数
  5.        months_between(to_date('2017-11-12', 'yyyy-mm-dd'),
  6.                       to_date('2018-10-12', 'yyyy-mm-dd')) as fs --负数
  7.   from dual;

结果:

8.jpg

8、日期截取函数:

·ROUND(r[,f])函数:将日期r按f的格式进行四舍五入。如果f不填,则四舍五入到最近的一天。

案例代码:

  1. select sysdate, --当前时间
  2.        round(sysdate, 'yyyy') as year, --按年
  3.        round(sysdate, 'mm') as month, --按月
  4.        round(sysdate, 'dd') as day, --按天
  5.        round(sysdate) as mr_day, --默认不填按天
  6.        round(sysdate, 'hh24') as hour --按小时
  7.   from dual;

结果:

9.jpg

·TRUNC(r[,f])函数:将日期r按f的格式进行截取。如果f不填,则截取到当前的日期。

案例代码:

  1. select sysdate, --当前时间
  2.        trunc(sysdate, 'yyyy') as year, --按年
  3.        trunc(sysdate, 'mm') as month, --按月
  4.        trunc(sysdate, 'dd') as day, --按天
  5.        trunc(sysdate) as mr_day, --默认不填按天
  6.        trunc(sysdate, 'hh24') as hour --按小时
  7.   from dual;

结果:

10.jpg


三、Oracle数值型函数

Oracle数值型函数可以是输入一个数值,并返回一个数值的函数,我们经常用到函数如下表:

函数

解释

案例

结果

ABS(X)

求数值X的绝对值

select abs(-9) from dual;

9

COS(X)

求数值X的余弦

select cos(1) from dual;

0.54030230586814

ACOS(X)

求数值X的反余弦

select acos(1) from dual;

0

CEIL(X)

求大于或等于数值X的最小值

select  ceil(7.8) from dual;

8

FLOOR(X)

求小于或等于数值X的最大值

select  floor(7.8) from dual;

7

log(x,y)

求x为底y的对数

select  log(2,8) from dual;

3

mod(x,y)

求x除以y的余数

select  mod(13,4) from dual;

1

power(x,y)

求x的y次幂

select  power(2,4) from dual;

16

sqrt(x)

求x的平方根

select  sqrt(16) from dual;

4

round(x[,y])

求数值x在y位进行四舍五入。

y不填时,默认为y=0;

当y>0时,是四舍五入到小数点右边y位。

当y<0时,是四舍五入到小数点左边|y|位。

select round(7.816, 2), round(7.816), round(76.816, -1)
  from dual;

7.82 / 8 / 80

trunc(x[,y])

求数值x在y位进行直接截取

y不填时,默认为y=0;

当y>0时,是截取到小数点右边y位。

当y<0时,是截取到小数点左边|y|位。

select trunc(7.816, 2), trunc(7.816), trunc(76.816, -1)
  from dual;

7.81 / 7 / 70



四、Oracle转换函数

Oracle转换函数是进行不同数据类型转换的函数,是我们平常数据库开发过程当中用的最多的内置函数。常用的函数有to_char()、to_number()、to_date()等等。详细分析如下表:

函数

解释

案例

结果

asciistr(x)

把字符串x转换为数据库字符集对应的ASCII值

select asciistr('Oracle技术圈')
  from dual;

Oracle\6280\672F\5708

bin_to_num(x1[x2...])

把二进制数值转换为对应的十进制数值

select bin_to_num(1,0,0) from dual;

4

cast(x as type)

数据类型转换函数,该函数可以把x转换为对应的type的数据类型,基本上用于数字,字符,时间类型安装数据库规则进行互转,

select cast('123' as number) num,cast(123 as varchar2(3)) as ch,cast(to_date('20181112','yyyymmdd') as varchar2(12)) as time
  from dual;

123/'123'/12-11月-18

(三列值,用"/"隔开)


convert(x,d_chset[,r_chset])

字符串在字符集间的转换函数,对字符串x按照原字符集r_chset转换为目标字符集d_chset,当r_chset不填时,默认选择数据库服务器字符集。


select CONVERT('oracle技术圈','US7ASCII','ZHS16GBK') from dual;

oracle???

to_char(x[,f])

把字符串或时间类型x按格式f进行格式化转换为字符串。


select to_char(123.46,'999.9') from dual; 

select to_char(sysdate,'yyyy-mm-dd') from dual; 

 123.5

2018-11-13

to_date(x[,f])

可以把字符串x按照格式f进行格式化转换为时间类型结果。

select to_date('2018-11-13','yyyy-mm-dd') from dual; 

2018/11/13

to_number(x[,f])

可以把字符串x按照格式f进行格式化转换为数值类型结果。

select to_number('123.74','999.99') from dual

123.74

提醒:其中数值的格式f可以参考下表:

参数

示例

说明

9

999

指定位置返回数字

.

99.9

指定小数点的位置


99,9

指定位置返回一个逗号

$

$99.9

指定开头返回一个美元符号

EEEE

9.99EEEE

指定科学计数法


五、Oracle聚合函数

Oracle聚合函数同时可以对多行数据进行操作,并返回一个结果。比如经常用来计算一些分组数据的总和和平均值之类,常用函数有AVG()、SUM()、MIN()、MAX()等等。

下列案例所需表结构参考:学生信息系统

1、AVG函数

AVG([distinct ] expr):该函数可以求列或列组成的表达式expr的平均值,返回的是数值类型。其中 distinct是可选参数,表示是否去掉重复行。

案例1、求学生信息表(stuinfo)中学生的平均年龄,代码如下:

  1. select * from stuinfo;
  2. select avg(t.age) from stuinfo t;

结果:

1.jpg

使用该函数和其他聚合函数时,都可以和where条件语句和分组GROUP BY 查询组合使用,得到特定的结果。

案例2,、按照班级求各班学生的平均年龄(其中年龄大于等于30岁的不计入在内)。代码:

  1. select classno, avg(t.age)
  2.   from stuinfo t
  3.  where t.age < 30
  4.  group by t.classno;

结果:

2.jpg

2、COUNT函数

count(*|[distinct]expr)函数可以用来计算查询结果的条数或行数。函数中必须指定列名或者表达式expr,不然就要全选使用*号。

案例3、查询学生信息表中所有的学生的个数。代码如下:

  1. select count(*) from stuinfo;

结果:

3.jpg

3、MAX/MIN函数

MAX([distinct] expr)、MIN([distinct] expr)函数可以返回指定列或列组成的表达式expr中的最大值或最小值。该函数也通常和where条件、group by分组结合在一起使用。

案例4、求学生信息表中年龄最大的学生的年龄:

  1. select max(age) from stuinfo;

结果:

4.jpg

4、SUM函数

SUM([distinct] expr)函数可以对指定列或列组成的表达式expr进行求和,假如不使用分组group by ,那就是按照整表作为一个分组。

案例5、正好利用sum函数求和乘以人数进行求学生的平均年龄

  1. select classno, sum(age), count(*), sum(age) / count(*), avg(age)
  2.   from stuinfo t
  3.  where t.age < 30
  4.  group by t.classno;

结果:

5.jpg

转载本站内容时,请务必注明来自W3xue,违者必究。
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号