本文系统总结了Oracle常用函数,分为数值、字符串和日期处理三大类。
数值函数包括ABS、POWER、ROUND等;字符串函数涵盖REPLACE、SUBSTR、INSTR等;日期函数包含LAST_DAY、ADD_MONTHS等。
文中提供了典型示例和实用技巧,如统计字符出现次数、模糊查询替代方案等。
最后通过综合练习演示了函数组合应用,并给出了最佳实践建议,如日期运算优先使用MONTHS_BETWEEN、字符串拼接推荐使用"||"等。
这些函数为Oracle数据库操作提供了强大的数据处理能力。
课堂笔记
根据你提供的课堂笔记内容,以下是对 Oracle 常用函数 的系统总结与梳理,分为 数值处理、字符串处理、日期处理 三大类,并附有典型示例和练习思路。
一、数值函数(针对 NUMBER 类型)
| 函数 | 说明 | 示例 |
|---|---|---|
ABS(x) |
绝对值 | SELECT ABS(-3.4) FROM DUAL; |
POWER(x, y) |
x 的 y 次幂 | SELECT POWER(4,2) FROM DUAL; |
ROUND(x, y) |
四舍五入保留 y 位小数 | SELECT ROUND(-3.4567,2) FROM DUAL; |
FLOOR(x) |
向下取整 | SELECT FLOOR(-3.567) FROM DUAL; |
CEIL(x) |
向上取整 | SELECT CEIL(3.14) FROM DUAL; |
TRUNC(x, y) |
截断(不四舍五入) | SELECT TRUNC(3.567,2) FROM DUAL; |
MOD(x, y) |
取余数 | SELECT MOD(7,3) FROM DUAL; |
✅ 注意:
TRUNC不进行四舍五入,直接舍弃多余小数位。
二、字符串函数(针对 VARCHAR2 类型)
| 函数 | 说明 | 示例 |
|---|---|---|
REPLACE(str, old, new) |
替换子串 | SELECT REPLACE('ABBCCDD','B','*') FROM DUAL; |
LENGTH(str) |
字符串长度 | SELECT LENGTH('中国') FROM DUAL; |
SUBSTR(str, m, n) |
从 m 位开始截取 n 位 | SELECT SUBSTR('ABCDEFG',2,3) FROM DUAL; |
INSTR(str, sub, m, n) |
查找子串位置 | SELECT INSTR('ABBDSDSKKD','D',5,2) FROM DUAL; |
TRIM(str) |
去除左右空格 | SELECT TRIM(' A B C D ') FROM DUAL; |
CONCAT(x, y) |
拼接字符串 | SELECT CONCAT('Hello',' World') FROM DUAL; |
LPAD(str, len, pad) |
左填充 | SELECT LPAD('8888',8,'*') FROM DUAL; |
RPAD(str, len, pad) |
右填充 | SELECT RPAD('8888',8,'*') FROM DUAL; |
常用技巧:
-
统计某字符出现次数 :
LENGTH(str) - LENGTH(REPLACE(str, '目标字符')) -
模糊查询替代方案 :
WHERE INSTR(ename, 'K') > 0等价于LIKE '%K%' -
字符串统一格式处理 :结合
SUBSTR+INSTR+LPAD
三、日期函数(针对 DATE 类型)
| 函数 | 说明 | 示例 |
|---|---|---|
LAST_DAY(date) |
当月最后一天 | SELECT LAST_DAY(SYSDATE) FROM DUAL; |
ADD_MONTHS(date, n) |
增加 n 个月 | SELECT ADD_MONTHS(SYSDATE, -2) FROM DUAL; |
MONTHS_BETWEEN(d1, d2) |
月数差(小数) | SELECT MONTHS_BETWEEN(...) FROM DUAL; |
TRUNC(date, '格式') |
截断到指定精度 | TRUNC(SYSDATE,'MM') → 当月第一天 |
date ± n |
推后/提前 n 天 | SELECT SYSDATE + 10 FROM DUAL; |
date1 - date2 |
相差天数 | SELECT SYSDATE - HIREDATE FROM EMP; |
常用日期截断格式:
-
'YYYY'→ 当年第一天(2026-01-01) -
'MM'→ 当月第一天(2026-04-01) -
'Q'→ 当季第一天(2026-04-01) -
'DD'→ 当天(不变)
典型计算:
-
入职月数 (向下取整):
FLOOR(MONTHS_BETWEEN(SYSDATE, HIREDATE)) -
入职年数 :
FLOOR(MONTHS_BETWEEN(...) / 12) -
上季度最后一天 :
TRUNC(SYSDATE,'Q') - 1
四、综合练习与典型思路
✅ 练习 1:统计字符串中 K 的个数
sql
SELECT
LENGTH('HBJBDKWWJJJK34K224HKN') -
LENGTH(REPLACE('HBJBDKWWJJJK34K224HKN','K')) AS CNT
FROM DUAL;
✅ 练习 2:姓名打码(首尾保留)
sql
SELECT
SUBSTR(ENAME,1,1) ||
LPAD('*', LENGTH(ENAME)-2, '*') ||
SUBSTR(ENAME,-1) AS NEW_ENAME
FROM EMP;
✅ 练习 3:截至当月第一天,员工已领月薪月数
sql
SELECT
FLOOR(MONTHS_BETWEEN(TRUNC(SYSDATE,'MM'), HIREDATE)) AS 月数
FROM EMP;
✅ 练习 4:计算机(1970-01-01)至上季度最后一天的月数
sql
SELECT
FLOOR(MONTHS_BETWEEN(TRUNC(SYSDATE,'Q')-1,
TO_DATE('1970-01-01','YYYY-MM-DD'))) AS 月份数
FROM DUAL;
五、注意事项 & 最佳实践
-
日期运算 优先使用
MONTHS_BETWEEN,避免手动处理天数/闰年。 -
字符串拼接 推荐使用
||,比CONCAT更灵活。 -
去空格 :
TRIM只去两端,如需去全部空格用REPLACE(str, ' ', '')。 -
日期截断常用于统计"月初"、"季初"等固定时间点。
-
Oracle 中 DUAL 是系统虚拟表,用于测试函数或常量查询。