目录
一、字符函数
字符函数的输入参数为字符类型,其返回值是字符类型或数字类型。字符函数分为以下两类:
- 大小写控制函数(upper、lower、initcap)
- 字符控制函数(concat、substr、length、instr、lpad、rpad、trim、replace)
大小写控制函数:这类函数用于改变字符的大小写。
- upper(char):该函数用于将字符串转换为大写格式。
- lower(char):该函数用于将字符串转换为小写格式。
- initcap(char):该函数用于将字符串中的每个单词的首字母大写,其它字符小写。
字符控制函数
- concat(str1,str2):该函数用于字符串的连接,str1和str2用于指定被连接字符串。例:concat('hello','oracle') 结果:hellooracle
- substr(char,m[,n]):该函数用于截取字符串,char指定源字符串,m用于指定从哪个位置开始截取,n用于指定截取字符串的长度。如果m为0,则从首字母开始,如果m为负数,则从尾部开始。例:
- sub('hello',1,3) 结果:hel
- sub('hello',0,3) 结果:hel
- sub('hello',-1,1) 结果:o
- length(char):该函数用于返回字符串的长度,字符串后的后缀空格也记作字符串的长度。例:length('oracle ') 结果:7
- instr(char1,char2[,n[,m]]):该函数用于取得子字符串在字符串中的位置,char1用于指定源字符串,char2用于指定子串,n用于指定起始搜索位置(默认值:1),m用于指定子串的第m次出现的次数(默认值:1)。例:
- instr('hello oracle','oracle') 结果:7
- instr('hello oracle hello oracle','oracle',1,2) 结果:20
- lpad(char1,n,char2):该函数用于在字符串的左端填充字符,char1用于指定源字符串,char2用于指定被填充的字符,n用于指定填充后的char1的总长度。例:lpad('hello',10,'#') 结果:#####hello
- rpad(char1,n,char2):该函数用于在字符串的右端填充字符,char1用于指定源字符串,char2用于指定被填充的字符,n用于指定填充后的char1的总长度。例:rpad('hello',10,'#') 结果:hello#####
- replace(char,search_string[,replacement_string]):该函数用于替换字符串的子串内容。char用于指定源字符串,search_string用于指定被替换字符串,replacement_string用于指定替换字符串。例:replace('hello oracle','oracle','world') 结果:hello world
--大小写控制函数
--upper
select * from emp where job = upper('salesman');
--lower
select * from emp where lower(job) = 'clerk';
--initcap
select empno, initcap(ename) from emp;
--upper、lower、initcap这三个函数的共同点,如果输入参数值为null时,则返回null
select empno, initcap(null) from emp;
--字符控制函数
--字符串连接符,实现雇员名与工资两列的连接
select ename || ':' || sal from emp;
--字符串连接的函数concat,实现雇员名与工资两列的连接
select concat(concat(ename,':'),sal) from emp;
--截串函数 substr
select * from emp where substr(job,1,4) = 'SALE';
--求字符串长度的函数 length
select * from emp where length(ename) = 6;
--instr 求子串在字符串中的位置
select instr('hello oracle','oracle') from dual;
select instr('hello oracle hello oracle', 'oracle', 1, 2) from dual;
--左填充函数 lpad
select lpad(job,9,'*') from emp;
--右填充函数 rpad
select rpad(job, 9, '*') from emp;
--替换函数 replace
select replace('hello oracle','oracle','world') from dual;
二、数值函数
数值函数的输入参数和返回值都是数字类型。常用的数值函数有:round()、trunc()、mod()。
- round(n[,m]):该函数用于返回四舍五入的结果,其中n可以是任意数字,m必须是整数(m若为负数,则保留小数点前m位)。例:
- round(25.328) 结果:25
- round(25.328,2) 结果:25.32
- round(25.328,-1) 结果:20
- trunc(n,[m]):该函数用于截取数字,其中n可以是任意数字,m必须是整数。例:
- trunc(25.328) 结果:25
- trunc(25.328,2) 结果:25.32
- trunc(25.328,-1) 结果:20
- mod(m,n):求模(求余数)。该函数用于取得两个数字相除后的余数。如果数字n位0,则返回结果位m。例:
- mod(25,6) 结果:1
- mod(25,0) 结果:25
--四舍五入的函数 round
--求员工的日工资
select round(sal/30,2) from emp;
--截断函数 trunc
select round(sal/30,2),trunc(sal/30,2) from emp;
--求余数的函数 Mod
--求员工号为偶数的员工信息
select * from emp where mod(empno,2)=0;
三、日期和时间函数
用于处理日期时间类型的函数。常用的日期时间函数有:sysdate、months_between、add_months、next_day、last_day、round、trunc。
- sysdate:用于返回当前系统日期
- months_between(d1,d2):用于返回日期d1和d2之间相差的月数。d1大于d2结果为整数,否则为负数。
- add_months(d,n):用于返回特定日期时间之后或之前的月份所对应的日期时间。(求出若干月之后的日期)d用于指定日期时间,n可以是任意整数。
- next_day(d,char):用于返回特定日期之后的第一个工作日所对应的日期。d用于指定日期时间值,char用于指定工作日。注意:当使用该函数时,工作日必须与日期语言匹配,加入日期语言为American,那么周一对应与“Monday”;加入日期语言为简体中文,那么周一对应于“星期一”。
- last_day(d):用于返回特定日期所在月份的最后一天。
- round(d[,fmt]):用于返回日期时间四舍五入的结果。d用于指定日期的时间值,fmt用于指定四舍五入的方式。如果fmt为year,则7月1日为分界线,如果设置fmt为month,则16日为分界线。
- trunc(d[,fmt]):用于截断日期时间数据。d用于指定日期的时间值,fmt用于截断日期时间数据的方法。如果fmt为year,则结果为本年度的1月1日;如果设置fmt为month,则结果为本月1日。
--sysdate
select sysdate-1 昨天 , sysdate 今天, sysdate+1 明天 from dual;
--months_between
select round(months_between(sysdate,hiredate)/12)from emp;
--add_months
select ename,add_months(hiredate,30*12) from emp;
--next_day
select next_day(sysdate,'星期一')from dual;
--last_day
select sysdate,last_day(sysdate) from dual;
select empno,ename,last_day(hiredate) from emp;
--round
select hiredate, round(hiredate,'YEAR'), round(hiredate,'MONTH') from emp where empno=7654;
--trunc
select hiredate, trunc(hiredate,'YEAR'), trunc(hiredate,'MONTH') from emp where empno=7654;
四、转换函数
该函数用于将数据从一种数据类型转换成另一种数据类型。Oracle可以隐式的(自动的)进行数据类型转换。
显示的数据类型转换:
- to_char:
- 将日期类型转换为字符类型。函数格式:to_char(d[,fmt[,'nlsparams']])。d用于指定日期值,fmt用于指定日期格式模型,‘nlsparams’用于指定日期格式语言。(格式:‘nls_date_language=language’)默认日期显示格式为dd-mon-rr。注意:当在格式模型中增加字符时,必须用双引号引住字符值。
- 将数值类型转换成字符类型。函数格式:to_char(n[,fmt])。n用于指定数值,fmt用于指定数字格式的模型。格式模型常用的元素如下 : 9:显示数字,并且会忽略前导0; 0:显示数字,如果位数不足则用0补齐; .:在指定位置显示小数点; $:在数字前加美元符号; L:在数字前加本地货币符号;
- to_date(char,[,fmt[,'nlsparams']]):用于将字符串转换成日期类型数据。char用于匹配日期数据的字符串,fmt用于指定日期格式模型,'nlsparams'用于指定日期语言。
- to_number(n[,fmt]):将包含数字的字符串转换成数值类型。n是包含数字的字符串,fmt用于指定数字格式模型。
--隐式数据类型转换的举例
select * from emp where sal>'2000';
select * from emp where hiredate='02-4月-81';
--to_char 日期类型转换成字符类型
select to_char(hiredate,'YYYY-MM-DD') from emp;
select to_char(hiredate,'YYYY"年"MM"月"DD"日"') from emp;
select to_char(hiredate,'DD-MON-RR','NLS_DATE_LANGUAGE=AMERICAN') from emp;
--to_char 数值类型转换成字符类型
select sal,to_char(sal,'L0,000,000.00')from emp;
select sal,to_char(sal,'L9,999,999.99')from emp;
select sal,to_char(sal,'$9,999,999.99')from emp;
--to_date 字符类型转换成日期类型
select ename,hiredate from emp where hiredate>to_date('1981-12-31','YYYY-MM-DD');
--to_number 字符类型转换成数值类型
select ename,sal from emp where sal>to_number('¥2000','L99999');
五、通用函数
此类函数适用于任何数据类型,同时也适用于空值。
处理null:在Oracle9i之前,处理null只能用函数nvl,但从Oracle9i之后,nvl或者nvl2都可以处理null。
- nvl(expr1,expr2):该函数用于处理null。如果expr1是null,则返回expr2。如果expr1不是null,则返回expr1。
- nvl2(expr1,expr2,expr3):该函数用于处理null。如果expr1不是null,则返回expr2。如果expr1是null,则返回expr3。
- nullif(expr1,expr2):该函数用于比较表达式expr1和expr2,如果二者相等,则返回null,否则返回expr1。
- coalesce(expr1[,expr2][,...]):返回表达式列表中第一个not null表达式的结果。
--nvl
select ename,sal,comm,sal+nvl(comm,0) from emp;
--nvl2
select ename,sal,comm,nvl2(comm,comm+sal,sal) from emp;
--nullif
select empno,ename,hiredate,nullif(hiredate,trunc(sysdate,'MONTH'))from emp;
--coalesce
select ename,sal,comm,coalesce(sal+comm,sal) from emp;
六、条件表达式
--想显示全部雇员的职位,但是这些职位要求替换为中文显示:
--
--CLERK:办事员;
--SALESMAN:销售;
--MANAGER:经理;
--ANALYST:分析员;
--PRESIDENT:总裁;
--case表达式
select empno,ename,
case job
when 'CLERK' then '办事员'
when 'SALESMAN' then '销售'
when 'MANAGER' then '经理'
when 'ANALYST' then '分析员'
else '总裁'
end
from emp;
--decode函数
select empno,ename,job,decode(job,'CLERK','办事员','SALESMAN','销售','MANAGER','经理','ANALYST','分析员','总裁')from emp;
--case表达式,区间值的判断
select empno,ename,sal,
case when sal<2000 then '低'
when sal<5000 then '中'
else '高'
end
from emp;
七、嵌套函数
--参照雇员信息表,想显示距聘用日期3个月后的下一个星期一的日期,且日期格式如:2017-01-06。
select empno,ename,to_char(next_day(add_months(hiredate,3),'星期一'),'YYYY-MM-DD') new_date
from emp;
--参照雇员信息表,显示雇员日薪并四舍五入到2 位小数的结果,然后对薪资格式以‘¥ 1,182.19’这样的例子形式进行格式化
select empno,ename,sal,to_char(round(sal/30,2),'L9,999.99')
from emp;