news 2026/3/1 15:23:57

【数据库】【Oracle】函数整理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【数据库】【Oracle】函数整理

Oracle 函数统计大全

本文系统梳理 Oracle 数据库全量函数体系,涵盖从基础到高级的所有函数类别,提供详细语法、示例和实战场景。


一、聚合函数(Aggregate Functions)

对多行数据进行汇总计算,常与GROUP BY子句配合使用。

1.1 基础聚合函数

函数功能示例
COUNT统计行数或非 NULL 值个数SELECT COUNT(*) FROM employees;
SUM计算数值总和SELECT SUM(salary) FROM employees;
AVG计算平均值SELECT AVG(salary) FROM employees;
MAX返回最大值SELECT MAX(salary) FROM employees;
MIN返回最小值SELECT MIN(salary) FROM employees;

性能差异

  • COUNT(*):统计所有行,需要扫描表,性能一般
  • COUNT(1):统计行数,不需要扫描具体列,性能较快
  • COUNT(column):统计非 NULL 值个数,扫描非 NULL 列
  • COUNT(DISTINCT column):计算不同值数量,使用排序,性能较慢
-- 部门薪资统计SELECTdepartment_id,COUNT(*)AS员工数,SUM(salary)AS总薪资,AVG(salary)AS平均薪资,MAX(salary)AS最高薪资,MIN(salary)AS最低薪资FROMemployeesGROUPBYdepartment_id;

1.2 高级聚合函数

函数功能
GROUPING SETS多维度分组汇总
ROLLUP分层汇总,生成小计和总计
CUBE多维立方体汇总
LISTAGG字符串聚合(11gR2+)
WM_CONCAT字符串聚合(10g-12c,已废弃)
-- ROLLUP 分层汇总SELECTdepartment_id,manager_id,SUM(salary)FROMemployeesGROUPBYROLLUP(department_id,manager_id);-- 结果:先按 department+manager 汇总,再按 department 汇总,最后总计-- CUBE 多维汇总SELECTdepartment_id,job_id,AVG(salary)FROMemployeesGROUPBYCUBE(department_id,job_id);-- 结果:所有维度组合(dept+job, dept, job, 总计)-- LISTAGG 字符串聚合SELECTdepartment_id,LISTAGG(first_name,',')WITHINGROUP(ORDERBYsalaryDESC)ASemployeesFROMemployeesGROUPBYdepartment_id;

二、字符串函数

处理和操作字符数据,是数据处理中最常用的函数类别。

2.1 大小写转换

函数功能示例
UPPER转大写UPPER('oracle') → 'ORACLE'
LOWER转小写LOWER('SQL') → 'sql'
INITCAP首字母大写INITCAP('hello world') → 'Hello World'

2.2 字符串连接与截取

函数功能示例
CONCAT连接两个字符串CONCAT('A', 'B') → 'AB'
||连接操作符'A' || 'B' → 'AB'
SUBSTR截取子串SUBSTR('Oracle', 1, 3) → 'Ora'
LENGTH返回字符串长度LENGTH('Oracle') → 6

2.3 查找与替换

函数功能示例
INSTR查找子串位置INSTR('Oracle SQL', 'SQL') → 8
REPLACE替换子串REPLACE('SQL*Plus', '*', ' ') → 'SQL Plus'
TRANSLATE字符替换TRANSLATE('ABC', 'BC', 'XY') → 'AXY'

2.4 填充与修剪

函数功能示例
LPAD左填充LPAD('123', 5, '0') → '00123'
RPAD右填充RPAD('456', 5, '*') → '456**'
LTRIM左修剪LTRIM(' ABC') → 'ABC'
RTRIM右修剪RTRIM('ABC ') → 'ABC'
TRIM两端修剪TRIM(' ABC ') → 'ABC'

2.5 其他字符串函数

-- ASCII/CHR:字符与ASCII码互转SELECTASCII('A')FROMdual;-- 65SELECTCHR(65)FROMdual;-- 'A'-- REGEXP_LIKE:正则表达式匹配SELECT*FROMemployeesWHEREREGEXP_LIKE(email,'^[a-z]+@[a-z]+\.com$');-- REGEXP_SUBSTR:正则提取SELECTREGEXP_SUBSTR('John,Smith,25','[^,]+',1,2)FROMdual;-- 'Smith'

三、数值函数

对数字进行计算和处理,支持数学运算和统计分析。

3.1 四舍五入与截断

函数功能示例
ROUND四舍五入ROUND(123.456, 2) → 123.46
TRUNC截断TRUNC(123.456, 2) → 123.45
CEIL向上取整CEIL(123.1) → 124
FLOOR向下取整FLOOR(123.9) → 123

3.2 数学运算

函数功能示例
MOD取模MOD(10, 3) → 1
POWER幂运算POWER(2, 3) → 8
ABS绝对值ABS(-123) → 123
SIGN符号函数SIGN(-123) → -1

3.3 三角函数与对数

-- 三角函数SELECTSIN(3.14159),COS(3.14159),TAN(3.14159)FROMdual;-- 对数SELECTLOG(10,100)FROMdual;-- 以10为底,100的对数 → 2-- 平方根SELECTSQRT(16)FROMdual;-- 4

3.4 统计分析函数

-- 标准差与方差SELECTSTDDEV(salary),VARIANCE(salary)FROMemployees;-- 中位数SELECTMEDIAN(salary)FROMemployees;-- 百分位数SELECTPERCENTILE_CONT(0.5)WITHINGROUP(ORDERBYsalary)FROMemployees;

四、日期时间函数

Oracle 日期处理功能极其强大,支持复杂的时间计算。

4.1 获取当前时间

函数功能返回类型
SYSDATE当前日期时间DATE
SYSTIMESTAMP当前时间戳TIMESTAMP
CURRENT_DATE当前会话日期DATE
CURRENT_TIMESTAMP当前会话时间戳TIMESTAMP
SELECTSYSDATE,SYSTIMESTAMPFROMdual;

4.2 日期加减

函数功能示例
+/-加减天数SYSDATE + 1(明天)
ADD_MONTHS加月份ADD_MONTHS(SYSDATE, 3)
MONTHS_BETWEEN月份差MONTHS_BETWEEN(SYSDATE, hire_date)
-- 计算明天、一小时前SELECTSYSDATE+1AStomorrowFROMdual;SELECTSYSDATE-1/24ASone_hour_agoFROMdual;-- 加3个月SELECTADD_MONTHS(SYSDATE,3)FROMdual;-- 计算工龄(月数)SELECTMONTHS_BETWEEN(SYSDATE,hire_date)FROMemployees;

4.3 日期提取与格式化

函数功能示例
EXTRACT提取年月日EXTRACT(YEAR FROM SYSDATE)
TO_CHAR格式化日期TO_CHAR(SYSDATE, 'YYYY-MM-DD')
NEXT_DAY下个星期几NEXT_DAY(SYSDATE, 'MONDAY')
LAST_DAY当月最后一天LAST_DAY(SYSDATE)
-- 提取年月日SELECTEXTRACT(YEARFROMSYSDATE)ASyear,EXTRACT(MONTHFROMSYSDATE)ASmonth,EXTRACT(DAYFROMSYSDATE)ASdayFROMdual;-- 格式化日期SELECTTO_CHAR(SYSDATE,'YYYY"年"MM"月"DD"日" HH24:MI:SS')FROMdual;-- 下周一SELECTNEXT_DAY(SYSDATE,'MONDAY')FROMdual;-- 本月最后一天SELECTLAST_DAY(SYSDATE)FROMdual;

4.4 日期截断与舍入

-- TRUNC 截断到指定单位SELECTTRUNC(SYSDATE,'MONTH')FROMdual;-- 当月第一天SELECTTRUNC(SYSDATE,'YEAR')FROMdual;-- 当年第一天-- ROUND 舍入到指定单位SELECTROUND(SYSDATE,'MONTH')FROMdual;

五、转换函数

实现不同数据类型间的转换,是数据清洗的关键工具。

5.1 字符串转换

函数功能示例
TO_CHAR转字符串TO_CHAR(12345.67, 'L99,999.99')
TO_NUMBER转数字TO_NUMBER('123.45')
TO_DATE转日期TO_DATE('2023-12-25', 'YYYY-MM-DD')
CAST通用转换CAST('123' AS NUMBER)
-- 数字格式化(货币)SELECTTO_CHAR(salary,'L99,999.99')FROMemployees;-- ¥12,345.67-- 日期格式化SELECTTO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS')FROMdual;-- 字符串转数字SELECTTO_NUMBER('123.45')+100FROMdual;-- 223.45-- 字符串转日期SELECTTO_DATE('2023-12-25 10:30:00','YYYY-MM-DD HH24:MI:SS')FROMdual;

5.2 空值处理

函数功能示例
NVL空值替换NVL(commission_pct, 0)
NVL2空值判断NVL2(expr1, expr2, expr3)
COALESCE返回首个非NULLCOALESCE(expr1, expr2, ...)
NULLIF相等返回NULLNULLIF(expr1, expr2)
-- NVL 处理空值SELECTfirst_name,NVL(commission_pct,0)FROMemployees;-- COALESCE 多值判断SELECTCOALESCE(phone_mobile,phone_home,phone_work,'N/A')FROMcontacts;-- NULLIF 避免除零SELECTNULLIF(salary,0)FROMemployees;

六、条件判断函数

6.1 DECODE 函数

Oracle 特有的条件判断函数,类似 switch-case。

-- 语法:DECODE(expr, search1, result1, search2, result2, ..., default)SELECTemployee_id,DECODE(department_id,10,'Admin',20,'Marketing',30,'Purchasing','Other')ASdept_nameFROMemployees;

6.2 CASE 表达式

标准 SQL 条件判断,更灵活。

-- 简单 CASESELECTemployee_id,CASEdepartment_idWHEN10THEN'Admin'WHEN20THEN'Marketing'ELSE'Other'ENDASdept_nameFROMemployees;-- 搜索 CASE(支持复杂条件)SELECTemployee_id,salary,CASEWHENsalary>10000THEN'High'WHENsalary>5000THEN'Medium'ELSE'Low'ENDASsalary_levelFROMemployees;

6.3 NULL 判断函数

-- NULLIFSELECTNULLIF(first_name,last_name)FROMemployees;-- 相同返回NULL-- LNNVL(否定条件)SELECT*FROMemployeesWHERELNNVL(salary>5000);-- 等价于 salary <= 5000 或 salary IS NULL

七、分析函数(窗口函数)

分析函数是 Oracle 高级特性,用于在结果集上执行计算,不改变行数。

7.1 排序函数

函数功能区别
RANK排名,相同值并列,有间隔1,1,3
DENSE_RANK密集排名,相同值并列,无间隔1,1,2
ROW_NUMBER唯一序号,相同值也区分1,2,3
-- 员工薪水排名SELECTemployee_id,salary,RANK()OVER(ORDERBYsalaryDESC)ASrank,DENSE_RANK()OVER(ORDERBYsalaryDESC)ASdense_rank,ROW_NUMBER()OVER(ORDERBYsalaryDESC)ASrow_numFROMemployees;

7.2 聚合分析函数

-- 部门内薪水占比SELECTemployee_id,department_id,salary,SUM(salary)OVER(PARTITIONBYdepartment_id)ASdept_total,salary/SUM(salary)OVER(PARTITIONBYdepartment_id)ASratioFROMemployees;-- 累计求和SELECTemployee_id,hire_date,salary,SUM(salary)OVER(ORDERBYhire_date)ASrunning_totalFROMemployees;

7.3 取值函数

-- LAG/LEAD:前后行取值SELECTemployee_id,hire_date,salary,LAG(salary,1)OVER(ORDERBYhire_date)ASprev_salary,LEAD(salary,1)OVER(ORDERBYhire_date)ASnext_salaryFROMemployees;-- FIRST_VALUE/LAST_VALUE:窗口首尾值SELECTemployee_id,department_id,salary,FIRST_VALUE(salary)OVER(PARTITIONBYdepartment_idORDERBYsalaryDESC)AShighest_salaryFROMemployees;

7.4 窗口定义

-- ROWS 窗口(物理行)SELECTemployee_id,salary,AVG(salary)OVER(ORDERBYemployee_idROWSBETWEEN2PRECEDINGAND2FOLLOWING)ASmoving_avgFROMemployees;-- RANGE 窗口(逻辑范围)SELECTemployee_id,salary,SUM(salary)OVER(ORDERBYsalary RANGEBETWEEN1000PRECEDINGAND1000FOLLOWING)ASrange_sumFROMemployees;

八、高级函数

8.1 随机数生成

-- DBMS_RANDOM 包SELECTDBMS_RANDOM.VALUE(0,100)FROMdual;-- 0-100随机数SELECTDBMS_RANDOM.STRING('U',10)FROMdual;-- 10位大写随机字符串

8.2 层次查询函数

-- CONNECT_BY_ROOT:根节点值SELECTemployee_id,last_name,CONNECT_BY_ROOT last_nameASroot_nameFROMemployeesSTARTWITHmanager_idISNULLCONNECTBYPRIOR employee_id=manager_id;-- SYS_CONNECT_BY_PATH:路径字符串SELECTemployee_id,SYS_CONNECT_BY_PATH(last_name,'/')ASpathFROMemployeesSTARTWITHmanager_idISNULLCONNECTBYPRIOR employee_id=manager_id;

8.3 其他实用函数

-- UID:当前用户IDSELECTUIDFROMdual;-- USER:当前用户名SELECTUSERFROMdual;-- GREATEST/LEAST:多值比较SELECTGREATEST(10,20,30),LEAST(10,20,30)FROMdual;-- 30, 10-- BIN_TO_NUM:二进制转数字SELECTBIN_TO_NUM(1,0,1)FROMdual;-- 5

九、实战场景与性能提示

9.1 场景示例

-- 场景1:员工绩效评级SELECTemployee_id,salary,CASEWHENsalary>PERCENTILE_CONT(0.9)WITHINGROUP(ORDERBYsalary)OVER()THEN'S'WHENsalary>PERCENTILE_CONT(0.7)WITHINGROUP(ORDERBYsalary)OVER()THEN'A'WHENsalary>PERCENTILE_CONT(0.5)WITHINGROUP(ORDERBYsalary)OVER()THEN'B'ELSE'C'ENDASperformance_gradeFROMemployees;-- 场景2:新员工留存率SELECTEXTRACT(YEARFROMhire_date)AShire_year,COUNT(*)AShired,COUNT(CASEWHENtermination_dateISNULLTHEN1END)ASretained,ROUND(COUNT(CASEWHENtermination_dateISNULLTHEN1END)/COUNT(*)*100,2)ASretention_rateFROMemployeesGROUPBYEXTRACT(YEARFROMhire_date);

9.2 性能优化建议

  1. 聚合函数:在 WHERE 子句中过滤数据后再聚合,减少计算量
  2. 分析函数:避免在大数据集上滥用ORDER BY导致排序溢出,可配合PARTITION BY缩小窗口
  3. 字符串函数:在 WHERE 子句中对列使用函数会导致索引失效,可考虑函数索引
  4. 日期函数:优先使用EXTRACT而非TO_CHAR进行日期判断,性能更好
  5. 空值处理NVLCOALESCE在大量数据上有性能差异,COALESCE 更优

十、总结

函数分类速查表

类别核心函数使用频率难度
聚合函数COUNT, SUM, AVG, MAX, MIN⭐⭐⭐⭐⭐
字符串函数SUBSTR, LENGTH, INSTR, TO_CHAR⭐⭐⭐⭐⭐
数值函数ROUND, TRUNC, MOD, ABS⭐⭐⭐⭐
日期函数SYSDATE, ADD_MONTHS, MONTHS_BETWEEN⭐⭐⭐⭐⭐
转换函数TO_CHAR, TO_DATE, TO_NUMBER, NVL⭐⭐⭐⭐⭐
条件函数CASE, DECODE, COALESCE⭐⭐⭐⭐
分析函数RANK, DENSE_RANK, ROW_NUMBER, SUM(…) OVER⭐⭐⭐
高级函数DBMS_RANDOM, CONNECT_BY_ROOT, LISTAGG⭐⭐

学习建议

  • 新手:掌握聚合、字符串、日期、转换函数,覆盖 80% 日常需求
  • 进阶:熟练使用 CASE 和窗口函数,解决复杂业务场景
  • 专家:深入理解分析函数执行原理,优化大数据量查询性能

Oracle 函数体系庞大且功能强大,建议结合实际业务场景反复练习,方能融会贯通。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/24 21:27:59

BioSIM抗人TIM-3/CD366抗体SIM0499:高亲和力与精准靶向

在免疫治疗领域&#xff0c;TIM-3&#xff08;T-cell immunoglobulin and mucin-domain containing-3&#xff09;作为重要的免疫检查点分子&#xff0c;正逐渐成为肿瘤免疫研究的焦点。针对 TIM-3 的抗体药物不仅为免疫疗法提供了新的方向&#xff0c;也推动了相关基础与转化研…

作者头像 李华
网站建设 2026/2/28 8:05:51

YOLOv11模型可在PyTorch-CUDA-v2.7镜像中高效运行

YOLOv11 模型在 PyTorch-CUDA-v2.7 镜像中的高效运行实践 在自动驾驶、智能监控和工业质检等场景中&#xff0c;实时目标检测的性能要求越来越高。如何在保证高精度的同时实现毫秒级推理响应&#xff1f;这不仅依赖于先进模型架构的演进&#xff0c;更离不开底层计算环境的深度…

作者头像 李华
网站建设 2026/2/26 3:13:14

conda config配置镜像源:加速PyTorch-CUDA-v2.7环境克隆

conda config配置镜像源&#xff1a;加速PyTorch-CUDA-v2.7环境克隆 在高校实验室的某个深夜&#xff0c;一位研究生正焦急地盯着终端——conda install pytorch 已经卡在“Solving environment”超过40分钟。旁边另一位同学轻描淡写地说&#xff1a;“你没配镜像源吧&#xff…

作者头像 李华
网站建设 2026/2/27 4:28:55

SSH远程接入PyTorch-CUDA-v2.7镜像进行模型训练的方法详解

SSH远程接入PyTorch-CUDA-v2.7镜像进行模型训练的方法详解 在AI研发一线&#xff0c;你是否经历过这样的场景&#xff1a;本地代码调试顺利&#xff0c;一上服务器却报错“CUDA not available”&#xff1f;或者团队成员之间因为PyTorch版本不一致导致训练结果无法复现&#xf…

作者头像 李华
网站建设 2026/2/26 11:57:26

无需手动installing torch:PyTorch-CUDA-v2.7已预装所有依赖

无需手动安装 PyTorch&#xff1a;PyTorch-CUDA-v2.7 镜像如何重塑深度学习开发体验 在深度学习项目中&#xff0c;你是否经历过这样的场景&#xff1f;刚拿到一台新服务器&#xff0c;满心欢喜地准备跑模型&#xff0c;结果卡在环境配置上整整两天——pip install torch 卡住、…

作者头像 李华
网站建设 2026/2/27 21:12:05

PyTorch+CUDA环境稳定性对比:自建 vs 镜像方案

PyTorchCUDA环境稳定性对比&#xff1a;自建 vs 镜像方案 在深度学习项目中&#xff0c;最让人头疼的往往不是模型调参&#xff0c;而是——“为什么你的代码在我机器上跑不起来&#xff1f;” 这个问题背后&#xff0c;通常藏着一个被低估的技术难题&#xff1a;PyTorch CU…

作者头像 李华