oracle数据库系统中定义了许多的函数(预定义),这些函数能够完成特有的数据操作功能,执行效率更高并重复使用。预定义函数按照操作执行特征可以分为:单行函数(对每个记录执行一次)、聚合函数(对多个记录执行一次),以下是具体的使用示例:
1、单行函数
1.1字符串函数
(1)substr(source, start,[length]):提取子串
SELECT substr('hjiouhuguih', 2, 3) FROM dual;----------jio
SELECT substr(NAME, 1, 2) FROM emp;------------取表中列的子串
(2)instr(source, target,[start],[rank]):查询子串的位置
SELECT instr('中国人是一个很大的国家', '一个', 2, 1) FROM dual;
(3)trim(source):去除空格
SELECT TRIM(' ser ') FROM dual;
SELECT lTRIM(' ser ') FROM dual;
SELECT rTRIM(' ser ') FROM dual;
(4)lpad(source, length, prefix):左补齐位数(右补齐为rpad(source, length, prefix))
SELECT lpad('23',10,'A') FROM dual;
(5)lower(source)、upper(source):大小写转换
SELECT lower('GOjgTDmgL') FROM dual;
SELECT upper('hoihhii') FROM dual;
(6)initcap(source)首字母变大写
SELECT initcap('mgL') FROM dual;
(6)length(source)获取长度
SELECT length('ihHgDFmIKmgL') FROM dual;
(7)字符串连接
SELECT '我是一个'||'成年人' FROM dual;
SELECT concat('我爱你', '中国') FROM dual;
1.2日期时间函数
(1)to_date(dateStr,format)将给定的字符串日期按照fomat格式转换为Date类型格式
SELECT to_date('1999-9-9 18:18:18', 'yyyy-MM-dd hh24:mi:ss') FROM dual;-----------1999/9/9 18:18:18
(2)to_timestamp(dateStr,format)将给定的字符串日期按照fomat格式转换为timestamp类型格式
SELECT to_timestamp('1999-9-9 18:18:18 4554611', 'yyyy-MM-dd hh24:mi:ss ff') FROM dual;
(3)add_months(date,increment)在date的基础上增加月份,增量可为负数
SELECT add_months(SYSDATE,1) FROM dual;----------从8月28日变为2019/9/28 17:15:59
(4)last_day()目标日期的最后一天
SELECT last_day(to_date('2015-2-8', 'yyyy-MM-dd')) FROM dual;----------2015/2/28
(5)months_between()两个月份的差
SELECT months_between(to_date('2015-2-8', 'yyyy-MM-dd'), to_date('2015-6-1', 'yyyy-MM-dd')) FROM dual;------3.7741935483871
(6)获取当前系统日期的字符串形式
SELECT current_date FROM dual;-----------2019/8/28 17:25:30
SELECT current_timestamp FROM dual;---28-8月 -19 05.25.30.605000 下午 +08:00
(7)to_char()
SELECT to_char(current_timestamp, 'yyyy/MM/dd hh24:mi:ss.ff5') FROM dual;------2019/08/28 17:32:58.13800
SELECT to_char(systimestamp, 'yyyy/MM/dd hh24:mi:ss.ff4') FROM dual;------2019/08/28 17:32:58.1740
(8)extract(year/month/day/hour/minute/second from date)从日期中提取相应时间部分
SELECT extract(YEAR FROM saldate) FROM sales WHERE ID = 5;---------2018
1.3数学计算函数(应保证操作的数据为数值类型或者内容为数字的字符串)
(1)abs(source)绝对值
SELECT abs(5.66) FROM dual;------------------5.66
SELECT abs(-5.66) FROM dual;-----------------5.66
SELECT abs('5.66') FROM dual;-----------------5.66
SELECT abs('-5.66') FROM dual;----------------5.66
SELECT abs('-5.66f') FROM dual;---------------报错(ora-01722,内容不是数字)
(2)round(source,[decimalLen])对给定的小数点及数值进行相关的四舍五入
SELECT round(45.9235) FROM dual;-----------46,默认舍去小数位
SELECT round(45.9235,3) FROM dual;---------45.924,四舍五入保留三位小数并
SELECT round(45.9235,-1) FROM dual;--------50,将整数部分最低位四舍五入
(3)ceil(number)向上取整
SELECT ceil(51.2) FROM dual;------------52
SELECT ceil(-51.2) FROM dual;-----------(-51)
(4)floor(number)向下取整
SELECT floor(51.2) FROM dual;--------------51
SELECT floor(-51.2) FROM dual;-------------(-52)
(5)sign(number)大于0结果为1,小于0结果为-1,等于0结果为0
SELECT sign(-51.2) FROM dual;-----------(-1)
SELECT sign(51.2) FROM dual;-------------1
SELECT sign(0) FROM dual;-----------------(0)
(6)sqrt(number)数值的平方根
SELECT round(sqrt(2),3) FROM dual;-----------1.414
(7)power(number,time)数值的乘方根
SELECT power(6,3) FROM dual;------------216
(8)trunc(number,time)按位数截取,不四舍五入
SELECT trunc(3.1415926,4) FROM dual;----------3.1415
(9)to_number(source)将字符串类型转换为值类型
SELECT to_number('3.1415') FROM dual;--------结果为3.1415的浮点常量
SELECT to_number('3.141500') FROM dual;------结果为3.1415的浮点常量
SELECT to_number('3.1415M') FROM dual;--------无效数字
1.4其它特殊函数
(1)ascii(number|String)返回给定数值或者字符串的首字母的ascii数字值
SELECT ascii('6') FROM dual;-----------54
SELECT ascii('A') FROM dual;-----------65
(2)chr(number|String)返回给定数值的字母形式
SELECT chr('65') FROM dual;------------A
(3)nvl(obj1,obj2)如果第一个值为null则返回第二个,否则返回第一个
SELECT nvl(NULL,'aaa') FROM dual;
SELECT nvl('ggg','aaa') FROM dual;
(4)nvl2(target,obj1,obj2)如果target为null则返回第二个,否则返回第一个
SELECT nvl2(NULL,'ggg','aaa') FROM dual;---------------aaa
(5)mod(m/n)取余
a、如果n为0,则结果为m
b、该函数的返回结果与除数符号相同
2、聚合函数(因为返回结果,所以必须出现在查询中)
(1)count(arg)统计给定参数不为空的记录、max()、min()、sum()、avg()
SELECT COUNT(comm) FROM emp;(空的记录被忽略了)
SELECT COUNT(empno) 统计条数, MAX(sal) 最高薪水, MIN(sal)最低薪水, AVG(sal) 平均薪水, sum(sal) 总薪水 FROM emp;
(2)分组聚合统计(group by(通常连接列) 、having(对分组的列进行限制))
SELECT deptno, SUM(sal) 各部门薪水之和 FROM emp GROUP BY deptno HAVING deptno <> 10;
只有参与分组的列和聚合函数才可以出现在查询语句中。