oracle数据库:常用函数

函数介绍

oracle sql提供了用于执行特定操作的专用函数,这些函数大大增强了SQL语言的功能,函数可以接收零个或者多个输入参数,并且返回一个输出结果。这种由oracle提供给我们的函数,称为内置函数,除了有内置函数外,还可以自定义函数。
根据函数的返回结果,我们将函数分为单行函数和多行函数

  1. 单行函数:对应在表记录时,一条记录返回一个结果。例如lower(x),将参数转换为小写。
  2. 多行函数;又称为组函数或者聚合函数【重点】:此类函数可以同时对多条记录进行操作,并返回一个结果【重点】。例如:max(x) 求最大值。

常用单行函数

字符函数:

  • concat(x,y): 连接字符串xy
  • 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表:
在这里插入图片描述
说明一下,下面例子中用到的dualoracle里面的一个虚表,安装了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子句来定位最高分:
在这里插入图片描述
其他方法都大同小异,这里不一个个展示了。

Guess you like

Origin blog.csdn.net/will__be/article/details/117462615