1. 函数概述
1.函数的作用:
方便数据的统计
处理查询结果
2.函数分类:
数值函数
字符函数
日期函数
转换函数
3.在查询中使用函数:
将小写字母转换成大写
查询时间间隔
四舍五入
2. 数值函数
1.四舍五入
ROUND(n[,m])
-- n表示要进行四舍五入的值
-- m表示保留小数点后几位或前几位
-- 省略m:0
-- m>0:小数点后m位
-- m<0:小数点前m位
eq: select round(23.4),round(23.45,1),round(23.45,-1) from dual; --23 23.5 20
2.取整函数
CEIL(n)-- 取最大值
FLOOR(N)-- 取最小值
eq: select ceil(23.45) from dual; -- 24
select floor(23.45) from dual; --23
3.常用计算
ABS(n) --取绝对值
eq: select abs(23.45),abs(-23),abs(0) from dual; -- 23.45 23 0
MOD(m,n) --取余数
-- 如果m和n中有 一个值为null值,则结果返回null值
eq: select mod(5,2) from dual; -- 1
select mod(5,null) from dual; -- null
select mod(null,5) from dual; -- null
POWER(m,n) -- 表示返回m的n次幂
2*2*2用 power(2,3)表示
eq: select power(2,3),power(null,2) from dual; -- 8 null
SQRT(n) -- 求平方根
16的平方根表示为 sqrt(16),结果为4
eq: select sqrt(16) from dual; --4
4.三角函数
SIN(n) -- 正弦
ASIN(n) -- 反正弦
COS(n) -- 余弦
ACOS(n) --反余弦
TAN(n) --正切
ATAN(n) --反正切
n均为弧度
eq: select sin(3.124) from dual; -- .017591746
3. 字符函数
大小写转换函数
UPPER(char) -- 小写-> 大写
LOWER(char) -- 大写-> 小写
INITCAP(char) -- 首字母大写
eq: select upper(‘abde‘),lower(‘ADe‘),initcap(‘asd‘) from dual; -- ABDE ade Asd
获取子字符串函数
SUBSTR(char,[m[,n]])
-- char : 源字符串 m: 取子串的开始位置 n: 截取子串的位数
-- n可以省略 当n省略时表示从m的位置截取到字符串末尾
-- m为0,表示从字符串的首字母开始截取
-- m为负数,表示从字符串的尾部开始截取
eq: select substr(‘abcde‘,2,3),substr(‘abcde‘,2),substr(‘abcde‘,-2,1) from dual; -- bcd bcde d
获取字符串长度函数
LENGTH(char)
eq: select length(‘acde ‘) from dual; -- 5
字符串连接函数
CONCAT(char1,char2)
与 || 操作符的作用一样
eq: select concat(‘ab‘,‘cd‘) from dual; -- abcd
去除子串函数
TRIM(c2 FROM c1)
eq: select trim(‘a‘ from ‘aabcde‘) from dual; -- bcde
LTRIM(c1[,c2])
eq: select ltrim(‘aabaaxaa‘ , ‘a‘) from dual; -- baaxaa
RTRIM(c1[,c2])
eq: select rtrim(‘aabaaxaa‘ , ‘a‘) from dual; -- aabaax
TRIM(c1) -- 去除左右的空格
LTRIM(c1) -- 去除左边的空格
RTRIM(C2) -- 去除右边的空格
替换函数
REPLACE(char,s_string[,r_string])
-- 省略r_string用空格替换
eq: select replace(‘abcde‘,‘a‘,‘A‘) from dual; -- Abcde
select replace(‘abcde‘,‘a‘) from dual; -- bcde
4. 日期函数
系统时间
SYSDATE
默认格式:DD-MON-RR (日-月-年)
eq: select sysdate from dual; -- 23-4月 -21
日期操作
ADD_MONTHS(date,i)
-- 返回在指定日期上添加的月份
-- i可以是任何整数
-- 如果i是小数,则截取整数部分
-- 如果i是负数,则相当于为原日期减去月份
eq: select add_months(sysdate,3),add_months(sysdate,-3) from dual; -- 23-7月 -21 23-1月 -21
NEXT_DAY(date,char)
-- 如果char的值是‘星期一’,则返回date指定日期的下周一是哪天
eq: select next_day(sysdate,‘星期一‘) from dual; -- 26-4月 -21
LAST_DAY(date)
eq: select last_day(sysdate) from dual; -- 30-4月 -21
MONTHS_BETWEEN(date1,date2)
-- 两个日期之间相隔的月份
eq: select months_between(‘20-5月-15‘,‘10-1月-15‘) from dual; -- 4.32258065
EXTRACT(date FROM datetime)
eq: select extract(year from sysdate) from dual; -- 年 2021
select extract(month from sysdate) from dual; -- 月 4
select extract(day from sysdate) from dual; -- 日 23
select extract(hour from timestamp ‘2015-10-1 17:25:13‘) from dual;-- 小时 17
select extract(minute from timestamp ‘2015-10-1 17:25:13‘) from dual;-- 分钟 25
select extract(second from timestamp ‘2015-10-1 17:25:13‘) from dual;-- 秒 13
5. 转换函数
日期转换成字符的函数
TO_CHAR(date[,fmt[,params]])
-- date :将要转换的日期
-- fmt: 转换的格式
-- params: 日期的语言
-- 日期默认的格式: DD-MON-RR
-- YY YYYY TEAR
-- MM MONTH
-- DD DAY
-- HH24 HH12
-- MI SS
eq: select to_char(sysdate,‘YYYY-MM-DD HH24:MI:SS‘) from dual; -- 2021-04-23 14:26:59
select to_char(sysdate,‘YYYY-MM-DD HH12:MI:SS‘) from dual; -- 2021-04-23 02:27:55
字符转换成日期的函数
TO_DATE(char[,fmt[,params]])
-- params: 用于指定日期的语言
-- fmt: 转换的格式
eq: select to_date(‘2021-04-23‘,‘YYYY-MM-DD‘) from dual; -- 23-4月 -21
-- to_date() 按照系统默认格式显示日期
数字转换成字符的函数
TO_CHAR(number[,fmt])
-- 9 : 显示数字并忽略前面的0
-- 0 : 显示数字,位数不足,用0补齐
-- . 或 D : 显示小数点
-- ,或 G : 显示千位符
-- $ : 美元符号
-- S : 加正负号(前后都可以)
eq: select to_char(12345.678,‘$99,999.999‘) from dual; -- $12,345.678
select to_char(12345.678,‘S99,999.999‘) from dual; -- +12,345.678
字符转换成数字的函数
TO_NUMBER(char[,fmt])
-- fmt: 转换的格式,可以省略
eq: select to_number(‘$1,000‘,‘$9999‘) from dual; -- 1000
6. 在查询语句中使用函数
在查询中使用字符函数
在员工信息表中查询出员工的生日
根据员工身份证号码得到员工生日
create table users(id varchar2(10),name varchar2(11),cardid varchar2(18),deptno varchar2(10),regdate date,age number(4,0));
insert into users values(1,‘abc‘,‘123456199205051234‘,‘01‘,sysdate,31);
select substr(cardid,7,8) from users; -- 19920505
将部门号01全部替换成‘信息技术‘
select replace(deptno,‘01‘,‘信息技术‘) from users;
在查询中使用数值函数
将员工信息表中的年龄字段与10取余数
select mod(age,10) from users; -- 1
在查询中使用日期函数
取得员工入职的年份
select extract(year from regdate) from users;
查询出4月份入职的员工信息
select * from users where extract(month from regdate)=4;
oracle-函数