前言
SQL 提供了丰富的内置函数,用于处理字符串、数值、日期等数据。以下整理了一些最常用的函数,附带示例说明。
字符串函数
| 函数 |
说明 |
示例 |
结果 |
LENGTH(str) |
返回字符串的字符数 |
SELECT LENGTH('克峰同学') FROM dual; |
4 |
LENGTHB(str) |
返回字符串的字节数(UTF-8 编码) |
SELECT LENGTHB('克峰同学') FROM dual; |
12(注1) |
CONCAT(str1, str2) |
拼接两个字符串 |
SELECT CONCAT('Hello', ' ', 'World') |
Hello World |
UPPER(str) |
将字符串转换为大写 |
SELECT UPPER('sql') |
SQL |
LOWER(str) |
将字符串转换为小写 |
SELECT LOWER('SQL') |
sql |
SUBSTR(str, pos, len) |
从指定位置截取子串 |
SELECT SUBSTR('abcdef', 2, 3) |
bcd |
INSTR(str, substr) |
返回子串第一次出现的位置 |
SELECT INSTR('hello world', 'world') |
7 |
TRIM([LEADING/TRAILING] char FROM str) |
去除字符串首尾指定字符 |
SELECT TRIM(' abc ') |
abc |
REPLACE(str, old, new) |
替换字符串中的子串 |
SELECT REPLACE('abc abc', 'abc', 'xyz') |
`` |
注1:LENGTHB 的字节数取决于数据库字符集。在 AL32UTF8 字符集下,一个汉字通常占 3 个字节;若为 GBK 或 ZHS16GBK,则占 2 个字节。示例中若返回 12,表示每个汉字 3 字节。若你的数据库使用 GBK,可能返回 8。
数值函数
| 函数 |
说明 |
示例 |
结果 |
CEIL(n) |
向上取整 |
SELECT CEIL(13.5) FROM dual; |
14 |
FLOOR(n) |
向下取整 |
SELECT FLOOR(13.5) FROM dual; |
13 |
ROUND(n, d) |
四舍五入,d 为小数位数 |
SELECT ROUND(13.567, 2) FROM dual; |
13.57 |
TRUNC(n, d) |
截断小数位,不四舍五入 |
SELECT TRUNC(13.567, 2) FROM dual; |
13.56 |
MOD(m, n) |
返回 m 除以 n 的余数 |
SELECT MOD(10, 3) FROM dual; |
1 |
ABS(n) |
返回绝对值 |
SELECT ABS(-5) FROM dual; |
5 |
POWER(m, n) |
返回 m 的 n 次幂 |
SELECT POWER(2, 3) FROM dual; |
8 |
SQRT(n) |
返回平方根 |
SELECT SQRT(16) FROM dual; |
4 |
日期函数
| 函数 |
说明 |
示例 |
结果 |
SYSDATE |
返回当前日期时间 |
SELECT SYSDATE FROM dual; |
2025-03-15 10:30:45 |
CURRENT_DATE |
返回当前日期(会话时区) |
SELECT CURRENT_DATE FROM dual; |
2025-03-15 |
EXTRACT(part FROM date) |
提取日期的某部分(年、月等) |
SELECT EXTRACT(YEAR FROM SYSDATE) FROM dual; |
2025 |
TO_DATE(char, format) |
将字符串转换为日期 |
SELECT TO_DATE('2025-03-15', 'YYYY-MM-DD') FROM dual; |
2025-03-15 |
TO_CHAR(date, format) |
将日期格式化为字符串 |
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') FROM dual; |
2025-03-15 10:30:45 |
MONTHS_BETWEEN(date1, date2) |
返回两个日期相差的月数 |
SELECT MONTHS_BETWEEN('2025-03-15','2025-01-15') FROM dual; |
2 |
ADD_MONTHS(date, n) |
给日期增加 n 个月 |
SELECT ADD_MONTHS('2025-03-15', 3) FROM dual; |
2025-06-15 |
NEXT_DAY(date, '星期X') |
返回指定日期之后的第一个星期几 |
SELECT NEXT_DAY(SYSDATE, '星期五') FROM dual; |
2025-03-21 |
LAST_DAY(date) |
返回月份的最后一天 |
SELECT LAST_DAY('2025-02-01') FROM dual; |
2025-02-28 |
转换函数
| 函数 |
说明 |
示例 |
结果 |
TO_NUMBER(char) |
将字符串转换为数字 |
SELECT TO_NUMBER('123.45') FROM dual; |
123.45 |
TO_CHAR(number, format) |
将数字格式化为字符串 |
SELECT TO_CHAR(12345.67, '999G999D99') FROM dual; |
12,345.67 |
CAST(expr AS type) |
将一个数据类型转换为另一个 |
SELECT CAST('123' AS INTEGER) FROM dual; |
123 |
聚合函数(用于分组统计)
| 函数 |
说明 |
示例(假设有一张员工表 emp) |
结果 |
COUNT(*) |
统计行数 |
SELECT COUNT(*) FROM emp; |
总行数 |
SUM(col) |
求和 |
SELECT SUM(salary) FROM emp; |
工资总和 |
AVG(col) |
求平均值 |
SELECT AVG(salary) FROM emp; |
平均工资 |
MAX(col) |
求最大值 |
SELECT MAX(salary) FROM emp; |
最高工资 |
MIN(col) |
求最小值 |
SELECT MIN(salary) FROM emp; |
最低工资 |
条件判断函数
| 函数 |
说明 |
示例 |
结果 |
CASE WHEN ... THEN ... ELSE END |
条件分支 |
SELECT CASE WHEN 1>0 THEN '真' ELSE '假' END FROM dual; |
真 |
DECODE(expr, search1, result1, ...) |
Oracle 特有的条件判断(类似 CASE) |
SELECT DECODE(2, 1, '一', 2, '二', '其他') FROM dual; |
二 |
COALESCE(expr1, expr2, ...) |
返回第一个非空表达式 |
SELECT COALESCE(NULL, NULL, '非空', '默认') FROM dual; |
非空 |
NULLIF(expr1, expr2) |
相等则返回 NULL,否则返回 expr1 |
SELECT NULLIF('A', 'B') FROM dual; |
|
注意事项
- 函数名不区分大小写,但为清晰通常大写。
- 不同数据库(Oracle、MySQL、SQL Server)的函数名称和用法可能略有差异,请根据实际环境查阅对应文档。
- 示例中的
FROM dual 是 Oracle 特有的虚拟表;其他数据库可能无需或使用其他方式(如 MySQL 可省略)。