插件窝 干货文章 oracle 函数用法

oracle 函数用法

SELECT salary 函数 employees 398    来源:    2025-04-23

Oracle 函数用法详解

Oracle 数据库提供了丰富的内置函数,可以用于数据处理、转换、计算和聚合等操作。以下是 Oracle 函数的分类和常用函数用法说明。

一、单行函数

单行函数对查询返回的每一行进行处理,为每行返回一个结果。

1. 字符函数

  • UPPER/LOWER/INITCAP: 大小写转换

    SELECT UPPER('hello'), LOWER('WORLD'), INITCAP('oracle database') FROM dual;
    -- 结果: HELLO, world, Oracle Database
    
  • SUBSTR: 截取子字符串

    SELECT SUBSTR('Oracle', 2, 3) FROM dual; -- 结果: rac
    
  • INSTR: 查找子字符串位置

    SELECT INSTR('Oracle', 'a') FROM dual; -- 结果: 4
    
  • LENGTH: 字符串长度

    SELECT LENGTH('Oracle') FROM dual; -- 结果: 6
    
  • TRIM/LTRIM/RTRIM: 去除空格或指定字符

    SELECT TRIM('  Oracle  ') FROM dual; -- 结果: Oracle
    
  • REPLACE: 字符串替换

    SELECT REPLACE('Oracle', 'a', 'A') FROM dual; -- 结果: OrAcle
    

2. 数值函数

  • ROUND: 四舍五入

    SELECT ROUND(45.926, 2) FROM dual; -- 结果: 45.93
    
  • TRUNC: 截断数值

    SELECT TRUNC(45.926, 2) FROM dual; -- 结果: 45.92
    
  • MOD: 取余数

    SELECT MOD(10, 3) FROM dual; -- 结果: 1
    
  • CEIL/FLOOR: 向上/向下取整

    SELECT CEIL(3.14), FLOOR(3.14) FROM dual; -- 结果: 4, 3
    

3. 日期函数

  • SYSDATE: 当前系统日期和时间

    SELECT SYSDATE FROM dual;
    
  • ADD_MONTHS: 增加月份

    SELECT ADD_MONTHS(SYSDATE, 3) FROM dual;
    
  • MONTHS_BETWEEN: 月份差

    SELECT MONTHS_BETWEEN('01-JAN-2023', '01-MAR-2023') FROM dual; -- 结果: -2
    
  • LAST_DAY: 月份最后一天

    SELECT LAST_DAY(SYSDATE) FROM dual;
    
  • NEXT_DAY: 下一个指定星期几的日期

    SELECT NEXT_DAY(SYSDATE, 'FRIDAY') FROM dual;
    
  • EXTRACT: 提取日期部分

    SELECT EXTRACT(YEAR FROM SYSDATE) FROM dual;
    

4. 转换函数

  • TO_CHAR: 转换为字符串

    SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') FROM dual;
    SELECT TO_CHAR(1234.56, 'L9,999.99') FROM dual; -- 结果: ¥1,234.56
    
  • TO_NUMBER: 转换为数字

    SELECT TO_NUMBER('1234.56') FROM dual;
    
  • TO_DATE: 转换为日期

    SELECT TO_DATE('2023-01-15', 'YYYY-MM-DD') FROM dual;
    

5. 通用函数

  • NVL/NVL2: 处理NULL值

    SELECT NVL(commission_pct, 0) FROM employees;
    SELECT NVL2(commission_pct, '有佣金', '无佣金') FROM employees;
    
  • COALESCE: 返回第一个非NULL表达式

    SELECT COALESCE(commission_pct, salary, 0) FROM employees;
    
  • NULLIF: 比较两个表达式

    SELECT NULLIF(length('hello'), length('world')) FROM dual;
    
  • DECODE: 条件判断

    SELECT DECODE(department_id, 10, '财务部', 20, '研发部', '其他部门') FROM employees;
    
  • CASE: 条件表达式

    SELECT CASE 
           WHEN salary > 10000 THEN '高薪'
           WHEN salary > 5000 THEN '中等'
           ELSE '低薪'
         END AS salary_level
    FROM employees;
    

二、聚合函数

聚合函数对多行数据进行计算,返回单个结果。

  • AVG: 平均值

    SELECT AVG(salary) FROM employees;
    
  • COUNT: 计数

    SELECT COUNT(*) FROM employees;
    SELECT COUNT(DISTINCT department_id) FROM employees;
    
  • MAX/MIN: 最大值/最小值

    SELECT MAX(salary), MIN(salary) FROM employees;
    
  • SUM: 求和

    SELECT SUM(salary) FROM employees;
    
  • LISTAGG: 字符串聚合

    SELECT department_id, LISTAGG(last_name, ',') WITHIN GROUP (ORDER BY last_name) 
    FROM employees 
    GROUP BY department_id;
    

三、分析函数

分析函数在分组的基础上进行计算,但不会减少行数。

  • ROW_NUMBER: 行号

    SELECT employee_id, last_name, salary,
         ROW_NUMBER() OVER (ORDER BY salary DESC) AS rank
    FROM employees;
    
  • RANK/DENSE_RANK: 排名

    SELECT employee_id, last_name, salary,
         RANK() OVER (ORDER BY salary DESC) AS rank,
         DENSE_RANK() OVER (ORDER BY salary DESC) AS dense_rank
    FROM employees;
    
  • LEAD/LAG: 访问前后行数据

    SELECT employee_id, last_name, salary,
         LAG(salary, 1, 0) OVER (ORDER BY salary) AS prev_salary,
         LEAD(salary, 1, 0) OVER (ORDER BY salary) AS next_salary
    FROM employees;
    
  • FIRST_VALUE/LAST_VALUE: 获取首尾值

    SELECT employee_id, last_name, salary,
         FIRST_VALUE(salary) OVER (ORDER BY salary) AS lowest_salary,
         LAST_VALUE(salary) OVER (ORDER BY salary) AS current_salary
    FROM employees;
    

四、自定义函数

Oracle 允许用户创建自定义函数:

CREATE OR REPLACE FUNCTION calculate_bonus(
  p_salary IN NUMBER,
  p_commission_pct IN NUMBER
) RETURN NUMBER
IS
  v_bonus NUMBER;
BEGIN
  v_bonus := p_salary * NVL(p_commission_pct, 0.1);
  RETURN v_bonus;
END calculate_bonus;
/

-- 使用自定义函数
SELECT employee_id, last_name, salary, calculate_bonus(salary, commission_pct) AS bonus
FROM employees;

五、函数使用技巧

  1. 函数嵌套:可以嵌套多个函数

    SELECT UPPER(SUBSTR(last_name, 1, 3)) FROM employees;
    
  2. 函数与GROUP BY结合

    SELECT department_id, AVG(salary)
    FROM employees
    GROUP BY department_id;
    
  3. 函数在WHERE子句中使用

    SELECT * FROM employees
    WHERE UPPER(last_name) LIKE 'SMITH%';
    
  4. 函数在ORDER BY中使用

    SELECT * FROM employees
    ORDER BY LENGTH(last_name) DESC;
    

Oracle 函数功能强大,合理使用可以大大提高SQL语句的表达能力和数据处理效率。