oracle数据库:常用函数
Posted 谦谦均
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle数据库:常用函数相关的知识,希望对你有一定的参考价值。
函数介绍
oracle sql
提供了用于执行特定操作的专用函数,这些函数大大增强了SQL
语言的功能,函数可以接收零个或者多个输入参数,并且返回一个输出结果。这种由oracle
提供给我们的函数,称为内置函数,除了有内置函数外,还可以自定义函数。
根据函数的返回结果,我们将函数分为单行函数和多行函数
- 单行函数:对应在表记录时,一条记录返回一个结果。例如
lower(x)
,将参数转换为小写。 - 多行函数;又称为
组函数
或者聚合函数
【重点】:此类函数可以同时对多条记录进行操作,并返回一个结果【重点】。例如:max(x)
求最大值。
常用单行函数
字符函数:
concat(x,y)
: 连接字符串x
和y
instr(x,str,start,n)
:在x
中查找str
,可以指定从start
开始,也可以指定从第n
次开始length(x)
:返回x
的长度lower(x)
:x
转换成小写upper(x)
:x
转换成大写ltrim(x,trim_str)
:把x
左边截去trim_str
字符串,缺省截去空格rtrim(x,trim_str)
:把x
右边截去trim_str
字符串,缺省截去空格replace(x,old,new)
:在x中查找old
,并替换成new
substr(x,start,length)
:返回x
的字符串,从start
处开始,截取length
个字符,如果没length
参数,默认到结尾。
数学函数
abs(x)
:求x的绝对值ceil(x)
:向上取整floor(x)
:向下取整mod(x,y)
:对x求y的余数
日期函数
sysdate
:获取系统当前时间current_date
:返回当前系统日期add_months(d1,n1)
:返回在日期d1
基础上再加n1
个月后新的日期last_day(d1)
:返回日期d1
所在月份最后一天的日期months_between(d1,d2)
:返回日期d1
到日期d2
之间的月数next_day(d1,[c1])
:返回日期d1
在下周,星期几(参数c1
)的日期。
转换函数
to_char(x,c)
:将日期或数据x
按照c
的格式转换为char
数据类型to_date(x,c)
:将字符串x
按照c
的格式转换为日期to_number(x)
:将字符串x
转换为数字型
常用组函数
avg()
:平均值sum()
:求和min()
:最小值max()
:最大值count()
:统计- 注意:
null
不参与运算
这里以其中几个函数举例子看看效果,数据表还是用student
表:
说明一下,下面例子中用到的dual
是oracle
里面的一个虚表,安装了oracle
就有,不需要额外创建,里面就一条数据。
例1:concat(x,y): 连接字符串x和y,实现将姓名和年龄连接起来
:
select concat(name,age) as new_name from student;
这里起了别名为new_name
,结果如下图;
例2:instr(x,str,start,n):在x中查找str,可以指定从start开始,也可以指定从第n次开始
。这里要求helloworld
找出字母o
,使用的是dual
虚表:
select instr('helloworld','o') from dual;
这里有个注意的地方,helloworld
里面有两个字母o
,看看能不能全部找出来:
如上图所示,只能找到一个,并且返回的是第一个字母o
的下标位置。如果想找第二个o
的位置,可以添加一个参数
select instr('helloworld','o',6) from dual;
这样就指定开始位置是下标为6
的字母,查询出来的结果如下图:
成功查询第二个字母o
的位置。
还可以用来查看学生姓名中是否包含‘花’
,如果包含,则显示位置:
select instr(name,'花') from student;
这个表中只有翠花
的名字里面含有花
,看看查询结果:
这里可以看到。名字没有花
的都显示的0
,有花的就显示了花
字的位置,并且这里没有起别名,所以查出的结果集字段默认为代码里面的字段。
例3: length(x) :返回x的长度
。这里查看id为5
的学生写姓名长度,当然我们知道是2
。
select name,length(name) as length from student where id = 5;
这里为了方便阅读,我把结果集起了一个别名为length
,结果如下图所示:
可以看到,结果跟预想的一样。
例4:ltrim(x,trim_str):把x左边截去trim_str字符串,缺省截去空格
。
select ltrim(' abc ') || 'abc' as new_str from dual;
这里我们用' abc '
来做例子,这个abc
两边都有两个空格,后面拼接一个abc
字符,起别名为new_str
,看看结果:
可以看到左边没有空格,成功截取空格。
select rtrim(' abc ') || 'abc' as new_str from dual;
接下来看看右边截取空格的效果:
可以看到右边的空格没了。那么如果想截取两边的空格怎么办呢?
select rtrim(ltrim(' abc '))||'A' as new_str from dual;
这里还在右边拼接一个字母A
,因为右边有没有空格肉眼不好看出来。结果如下图所示:
这里先去掉左边的空格,然后调用右边截取函数去掉右边空格。
例5:substr(x,start,length):返回x的字符串,从start处开始,截取length个字符,如果没length参数,默认到结尾。
这里以查询学生的姓为例子:
select name,substr(name,1,1) as substr_name from student;
函数里面两个参数1
分别是:从第一个开始截取,截取一个。
例6:sysdate:获取系统当前时间
,current_date:返回当前系统日期
。这两种方法都可以获取系统时间,这里以dual
虚表为例子:
select sysdate from dual;
结果如下图所示:
看看第二个方法:
select current_date from dual;
结果:
这里有个细节,这两个函数可以进行加减法,比如sysdate+1
,这里示范一下效果:
select sysdate+1 from dual;
今天是2021年6月2日
,我们来看看结果:
这里可以看到是日期加了1
,变成了6月3号
的。
例7:next_day(d1,[c1]):返回日期d1在下周,星期几(参数c1)的日期
。这里查看下个星期一为例子:
select next_day(sysdate,'星期一') as 下周一 from dual;
这里先获取当前系统时间,然后根据当前系统时间得到下周一
的时间。
例8:to_char(x,c):将日期或数据x按照c的格式转换为char数据类型
。这个函数一般用来将日期转换成字符。
第一个参数可以传入日期,第二个参数传要转换的字符格式,刚才查询的日期格式多数为2021/6/7 13:46:37
这样的格式,我想看2021-06-07 13:46:37
这种格式:
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
这里有个注意的地方,时间hh
后面可以填24
或者12
,24
表示24小时制
,可以显示13
点这样的时间值,如果选择12小时制
的,但是当前时间大于12
点就会报错,mi
表示分钟,ss
表示秒。
如果想显示2021年6月7日 13时46分37秒
这样的格式,怎么实现呢?
select to_char(sysdate,'yyyy"年"mm"月"dd"日" hh24"时"mi"分"ss"秒"') as time_now from dual;
这里用双引号
将中文字符引起来,表示这部分内容要原样输出【重要】。效果如下图所示:
例9:to_date(x,c):将字符串x按照c的格式转换为日期。
这个函数一般用来将截取到表示日期的一串字符串转换成日期格式。x
表示要转成日期的字符串,c
表示转成的日期格式。
select to_date('1996/12/26','yyyy/mm/dd')+1 as next_day from dual;
这里在日期后面+1
用来测试是不是真的转换成功,因为日期+1
表示这个日期的后一天,as
后面接的是别名,看看效果:
当然,表示日期的字符串跟要转成的日期格式最好一样,这里测试一种不一样的情况:
select to_date('1996/12/26','yyyy-mm-dd')+5 as next_day from dual;
看看结果是什么:
例10:to_number(x):将字符串x转换为数字型。
这个方法用的不多,比较特地的地方是可以将字符以特定的进制转换成数字类型,比如2进制,8进制
等。
如果要转换成10进制
,可以不用方法,实现自动转换:
select '12'+1 from dual;
如果不想改变数字本身的值,可以用+0
来实现,这里+1
是为了看到效果,因为字符是不满足数字的加减法的,所以能加上去就说明自动转换成功。
假设现在有个16进制
的数11
这样的字符串,要转换成10进制
的数字类型,怎么实现呢
select to_number('11','xx') as res from dual;
这里xx
表示原数字是16进制
,现在要转换成10进制
的,结果如下:
例11:avg():平均值。
组函数都比较顾名思义,比如这个是求平均值的:
select avg(math),avg(english) from student;
这里是求学生表里面的数学和英语成绩的平均分:
例12:max():最大值。
这里求学生表里面数学成绩最高分,并且展示这个人的全部信息:
select * from student where math = (select max(math) from student);
这里用了where
子句来定位最高分:
其他方法都大同小异,这里不一个个展示了。
以上是关于oracle数据库:常用函数的主要内容,如果未能解决你的问题,请参考以下文章