函数介绍
oracle sql提供了用于执行特定操作的专用函数,这些函数大大增强了SQL语言的功能,函数可以接收零个或者多个输入参数,并且返回一个输出结果。这种由oracle提供给我们的函数,称为内置函数,除了有内置函数外,还可以自定义函数。
根据函数的返回结果,我们将函数分为单行函数和多行函数
- 单行函数:对应在表记录时,一条记录返回一个结果。例如
lower(x),将参数转换为小写。 - 多行函数;又称为
组函数或者聚合函数【重点】:此类函数可以同时对多条记录进行操作,并返回一个结果【重点】。例如:max(x)求最大值。
常用单行函数
字符函数:
concat(x,y): 连接字符串x和yinstr(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,并替换成newsubstr(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的函数,包括内置和自定义函数,按返回结果分为单行和多行函数。详细列举了常用单行函数,如字符、数学、日期、转换函数,以及常用组函数。还通过多个示例展示了这些函数的使用方法和效果。
183

被折叠的 条评论
为什么被折叠?



