Oracle基础——函数

WHY?

    有时候我们需要得到对数据库记录进一步处理的数据,比如:我们需要对数据汇总,得到当前时间等,这些功能可以反复调用,我们跟java里一样:反复调用的代码就定义一个函数。Oracle数据库给我们预先提供了许多函数

函数的分类

按照处理的数据类型及功能分为:

字符型:

日期型:

数值类型:

转换函数:三种数据类型的转换函数

增强型查找工具:正则表达式

按输入参数和输出参数个数分:

单行函数:一行输入对应一行输出

聚集函数:多行输入对应一行输出

字符函数

--字符函数
--1 属性
--1.1 字符串的长度:字符,字节
select length('咚'),lengthb('冬') from dual;--1 3
--2 大小写
--2.1 句子中每个单词首字母大写
select initcap('i love bei jing') from dual;--I Love Bei Jing
--2.2 所有字母大小写
select upper('i love bj'),lower('I  LOVE BJ') from dual;--I LOVE BJ,i love bj
--3 字符填充与删除
--3.1删除
select ltrim('  abs '),ltrim('#asd#','#'),rtrim(' asd '),rtrim('#asd#','#') from dual;--abs ,asd#, asd,#asd
select trim('#' from '#sd#') from dual;--sd
--3.2填充字符
select lpad('asd',5),lpad('asd',10,'#')from dual;--  asd,#######asd
select rpad('asd',5),rpad('asd',10,'#')from dual;--asd  ,asd#######
--4 子串
--4.1 获取子串
select substr('asdfghj',3) from dual;--dfghj 获取第3个字符及以后的所有字符
select substr('asdfghj',3,4) from dual;--dfgh 获取第3个字符及以后3个,共4个
--4.2 字符串连接函数
select concat('咚咚','馬') from dual;--咚咚馬
select '咚咚'||'馬' from dual;--咚咚馬
--4.3 子串的查找
--参数1:要查找的源字符串;参数2:要在源字符串中查找的字符串;
--参数3:3 表示从左往右第3个字符开始查找,若为-3则表示从右往左第3个字符开始查找,默认为1;
--参数4:表示查找的字符串出现的次数
--位置索引号从1开始,返回值为查找到的位置号
select instr('dongdongmaon','on',3,1) from dual;--6
--4.4 用子串修改
select replace('dongdongma','d','b') from dual;--bongbongma
--4.5 发音类似词
select * from dual where soundex(last_name)
         = soundex('smythe')
--6 空值处理函数
--6.1 用指定字符串代替
select nvl(province,100000) from table;--若province为null则用100000代替
--数值函数
-- 1 正负数相关
select abs(-12) from dual;--12 绝对值
select sign(15),sign(-12),sign(0) from dual;--正负号:正数 1,负数 -1,零 0
--2 舍入
--2.1 四舍五入
--默认从小数点后一位四舍五入,只留整数;-1表示从小数点前边第一位四舍五入,0补;1表示从小数点后第二位四舍五入
select round(13.1415),round(13.1415,0),round(15.1415,-1),round(13.9615,1) from dual;--13,13 20,14
--2.2 截断
select trunc(13.14),trunc(13.14,0),trunc(13.14,-1),trunc(13.14,1) from dual;--13,13,10,13.1
--2.3 向上取整
select ceil(12.23),ceil(0.12) from dual;--13,1
--2.4 向下取整
select floor(0.12),floor(12.56) from dual;--0,12
--3 幂
--3.1 平方
select sqrt(25) from dual;--5
--3.2 任意次幂
select power(2,3),power(2,0.5) from dual;--8,1.414
--3.3 e的指数
select exp(4) from dual;--54.599
--4 三角函数
--4.1 正弦:弧度
select sin(30*3.14/180),cos(30*3.14/180),tan(30*3.14/180) from dual;--0.5,0.87,0.58
--5 对数
--5.1 自然对数
select ln(2.718) from dual;--1
--5.2 任意对数
select log(2,8) from dual; --3
--6 统计
--6.1 最大值,最小值
select max(param1),min(param1) from table;
--6.2 求平均数,方差,标准方差
select avg(param1),variance(param1),stddev(param1)from table;
--6.3 计算记录个数
select count(*) from table;--包括空值
select count(all param1) from table;--不包括空值
select count(distinct param1) from table;--不包括空值,重复值只取一次

--decode用法

decode(表达式,条件1,结果1,条件2,结果2,...)

例如:

假如要对一个企业的员工进行工资调整,对于3000块以下的提高10%,3000块以上的提高5%,那么如果用我们一般的做法就是对工资进行判断,如果大于3000,就加5%,而低于3000的就加10%。不过现在有了这个decode函数,那么就可以简单的用下面的语句:

select decode(sign(salary-3000),1,salary*1.1,-1,salary*1.05) from employee

--日期函数
--1 系统当前时间
select sysdate from dual;
--2 返回当前时间:带时区,带分秒
select systimestamp from dual;
select systimestamp at time zone 'utc' from dual;
--3 时间成分提取
--3.1 年、月、日
select extract(year from date '1998-01-07') "year",
extract(month from date '1998-01-07') "month",
extract(day from date '1998-01-07') "day" from dual;--1998  1    7
--3.2 时分秒提取
select extract(hour from systimestamp)"hour",
extract(minute from systimestamp)"minute",
extract(second from systimestamp)"second"  from dual;
--4 时间差计算
select to_date('2017/3/31 17:01:01','yyyy/mm/dd hh24:mi:ss')-to_date('2016/3/31 17:01:01','yyyy/mm/dd hh24:mi:ss') from dual;

--转换函数
--接收日期
select to_char(sysdate,'yyyy/mm/dd') from dual;--2017//03/31 到日
select to_char(sysdate, 'yyyy/mm/dd hh24:mi:ss') from dual;--2017/03/31 17:13:07 到秒
select to_char(sysdate, 'day') from dual;--星期五
select to_char(sysdate,'dl') from dual; --2017年3月31日 星期五
select to_char(systimestamp,'ss.ff3') from dual;--到毫秒
select to_char(sysdate,'iw') from dual;--本年第几周 13
select to_char(sysdate,'q')from dual;--本年第几季度
--接收数字
select to_char(1123.3,'fm9990.0099') from dual;--1123.30

正则表达式

--正则表达式
--1 正则表达式子串
--返回以逗号开始和结束,中间不包含逗号的子串,返回该子串
select regexp_substr('500 Oracle Parkway,Redwood Shores , CA',',[^,]+,')"regexpr_sunstr" from dual;--,Redwood Shores ,
--2 正则表达式查找
--从第一个字符查找不包含空格的字符串,返回第6个匹配的字符串的第一个字母的位置
select regexp_instr('500 Oracle Parkway, Redwood Shores, MDZZ','[^ ]+',1,6) "REGEXP_INSTR" from dual; --37
--3 count语句增强版
--找出以s开头后跟三个字母的子串,返回匹配的个数
select regexp_count('But,soft! What light through yonder window softly breaks?','s[[:alpha:]]{3}')as result from dual;--2
--4 正则表达式替换字符
--下面代码查找模式为xxx.xxx.xxxx的号码,函数把它格式化为模式(xxx )xxx-xxxx.
select regexp_replace('010.227.8888',
'([[:digit:]]{3})\.([[:digit:]]{3})\.([[:digit:]]{4})',
'(\1) \2-\3') "REGEXP_REPLACE" from dual;--(010) 227-8888

其它:

NVL函数

NVL(exps,0)  :如果exps为null则返回0.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值