注 :dual 是一个虚拟表,用来构成select的语法规则,它实际是不存在的
一:单行函数
•字符串处理函数:UPPER(),LOWER() ,INITCAP(),LENGTH(),SUBSTR(),REPLACE();
•数值处理函数:ROUND(),TRUNC(),MOD();
•日期处理函数:ADD_MONTHS(),MONTHS_BETWEEN(),LAST_DAY(),NEXT_DAY();
•转换函数:TO_DATE(),TO_CHAR(),TO_NUMBER();
•通用函数:NVL(),DECODE()。
1.字符串处理函数
(1).转大小写函数:
•转大写函数:UPPER(字符串 | 列);
•转小写函数:LOWER(字符串| 列);
SELECT LOWER(ename) FROM 表名 ; //查询表里员工姓名,姓名小写显示
SELECT * FROM 表名 WHERE ename=UPPER('inputName'); //查询输入的员工姓名,转大写
(2).获取字符串长度:
•长度函数:数字 LENGTH(字符串 | 列);
SELECT * FROM emp WHERE LENGTH(ename) = 5 ; //查询所有姓名长度为5的雇员信息
(3).字符串截取; SUBSTR(汉译:字符串的子串,就是截取呀)
•截取函数:字符串 SUBSTR(字符串| 列 ,截取索引起始,[长度]),如果没有长度,表示截取到结尾 ;
SELECT 'HELLO' ,SUBSTR('HELLO',2,3) FROM 表名 ; //从表里截取‘HELLO’字符串,从第二位开始,截取3个长度
SELECT ename,SUBSTR(ename,LENGTH(ename)-2) FROM emp ; //查询雇员姓名后三位字符,这里使用的是传统索引
SELECT ename,SUBSTR(ename , -3) FROM emp ; //查询雇员姓名后三位字符,Oracle支持有负数索引
备注:Oracle的截取索引是从1开始的,而我们在其他程序索引都是从第0位开始的
(4).字符串替换:
• 替换函数:字符串 REPLACE(字符串 | 列 , 原始内容,替换内容)
SELECT REPLACE('HELLO', 'E' , 'M') FROM dual ; //把“HELLO”中的“E”替换为“M”;
2.数值处理函数
(1)四舍五入:
四舍五入:数字 ROUND(数值 | 列[,保留小位数位数])
SELECT ROUND(1.23456) FROM dual ; //处理后的结果为 ”1“
SELECT ROUND(1.123456,2) FROM dual ; //处理后的结果为1.12 ,保留了2位小数位
SELECT ROUND(399,-2) FROM dual ; //处理后的结果为400,当保留小数的位数设置为负数,则表示操作的是整数
(2)截取小数(省略小数位):
截取小数:SELECT TRUNC(数值 | 列 [,保留小数位]) // TRUNC汉译:将数字截尾取整
SELECT TRUNC(1.123456) FROM dual ; //运行结果为:1
SELECT TRUNC(1999,-3) FROM dual ; //执行结果为:19
(3) 求模(余数):
• 求模函数:数值MOD(数值 1 | 列 1,数值2 | 列2)
SELECT MOD (20,7) FROM dual ; //执行结果: 余数为 6
3.日期函数
(1)SYSDATE :系统日期
SELECT SYSDATE FROM FROM dual ; //获取当前日期
SELECT SYSDATE + 300 FROM dual ; //获取300天后日期
SELECT SYSDATE - 500 FROM dual ; //获取500天前日期
SELECT SYSDATE - hiredate FROM emp ; //获取雇员被雇佣天数
(2)SYSTIMESTAMP: 时间戳
SLEECT SEYSTIMESTAMP FROM dual ; //获取当前时间戳
(3)ADD_MONTHS() :计算若干月之后日期
SELECT ADD_MONTHS(SYSDATE,10) FROM dual ; //10个月之后的日期
(4)LAST_DAY():获取当前月的最后一天日期
SELECT LAST_DAY(SYSDATE) FROM dual ;
SELECT ename,hiredate,LAST_DAY(hiredate)-2 FROM emp ; //雇佣所在月倒数第三天
(5)NEXT_DAY():获取下一个指定日期时间数的日期;
SELECT NEXT_DAY(SYSDATE,'星期二') FROM dual ;
(6)MONTHS_BETWEEN():计算两个日期之间所跨越的总月数;
SELECT ename,MONTHS_BETWEEN(SYSDATE,hiredate) FROM emp; //从雇佣到现在日期时长
SELECT ename,hirtedate,TRUNC(MONTHS_BETWEEN(SYSDATE,hiredate)/12) year FROM emp ; // 计算雇佣年份
SELECT ename,hiredate,TRUNC(MONTHS_BETWEEN(SYSDATE,hiredate)/12) year,
TRUNC(MOD(MONTHS_BETWEEN(SYSDATE,hiredate),12)) months FROM emp ; //计算雇佣年份加月份
SELECT ename,hiredate,TRUNC(MONTHS_BETWEEN(SYSDATE,hiredate)/12) year,
TRUNC(MOD(MONTHS_BETWEEN(SYSDATE,hiredate),12)) months FROM emp
TRUNC(SYSDATE-ADD_MONTHS(hiredate,MONTHS_BETWEEN(SYSDATE,hiredate))) day FROM emp; //计算雇佣年份加月份
5.转换函数:
TO_CHAR(日期|数字|列,转换格式):可以将数字或日期进行格式化的显示处理
(1)日期转换
SELECT TO_CHAR(SYSDATE,'yyyy-mm-dd') FROM dual ; //日期转换
SELECT TO_CHAR(SYSDATE,'yyyy-mm-dd hh24:mi:ss') FROM dual ; //详细时间转换
(2)货币转换
SELECT TO_CHAR(123456,'L999,999') FROM dual; //执行结果 :999,999
TO_DATE(字符串 | 列,格式):将字符串转为DATE类型
SELECT TO_DATE('2006-11-20 20:39:15','yyyy-mm') FROM dual ; //日期转换
TO_NUMBER()日期转换
SELECT TO——NUMBER(‘1’) + TO_NUMBER('2') FROM dual ; //运行结果 :3
SELECT '1' + '2' dual ; //运行结果:3
6.通用函数:
NVL() :把空转换为0,当需要数据计算时使用
SELECT ename,comm,NVL(comm,0),(sal+NVL(comm,0)) * 12 income FROM emp ; //运行结果:把空值替换为0了
DECODE() :数值内容的判断与替换操作
DECODE(数据 | 列,匹配内容1,返回内容1,[不满足时的内容])
SELECT ename,job ,DECODE(job,'CLERK','办事员',‘无法判断的内容’)decode FROM emp; //这里对指定的CLERK替换为办事员,查询不到的返回