常用的sql函数汇总
统计聚合函数(AggregateFunctions)
| `COUNT()` | 统计行数,可统计非空值或所有行 | `COUNT(*)`, `COUNT(column)` |
| `SUM()` | 求和,常用于数值型字段 | `SUM(sales)` |
| `AVG()` | 计算平均值 | `AVG(score)` |
| `MAX()` | 返回某列最大值 | `MAX(date)` |
| `MIN()` | 返回某列最小值 | `MIN(price)` |
| `COUNT(DISTINCT column)` | 去重后统计数量 | `COUNT(DISTINCT user_id)` |
⚠️ 注意:聚合函数会忽略
NULL值(除COUNT(*)外)
字符串处理函数(StringFunctions)
| 函数 | 说明 | 应用 |
|---|---|---|
| CONCAT(str1, str2,...) | 字符串拼接 | CONCAT(first_name, ' ', last_name) |
| TRIM(str) | 去除首尾空格 | TRIM(' hello ') → 'hello' |
| LTRIM(str) / RTRIM(str) | 分别去除左/右空格 | |
| UPPER(str) / LOWER(str) | 转大写 / 小写 | UPPER('abc') → 'ABC' |
| SUBSTRING(str, start, length) | 截取子字符串 | SUBSTRING('hello', 2, 3) → 'ell' |
| LENGTH(str) | 返回字符串长度(字节数) | `LENGTH('abc') → 3 |
| CHAR_LENGTH(str) | 返回字符个数(支持多字节) | CHAR_LENGTH('你好') → 2 |
| REPLACE(str, old, new) | 替换字符串 | REPLACE(phone, '-', '') |
| INSTR(str, substr) | 返回子串首次出现位置 | INSTR('abc', 'b') → 2 |
日期与时间函数(Date& Time Functions)
| `NOW()` /`CURRENT_TIMESTAMP()` |获取当前日期时间 | `SELECT NOW();` |
| `CURDATE()` | 获取当前日期(无时间部分) | `2025-04-05` |
| `CURTIME()` | 获取当前时间 | `14:30:25` |
| `YEAR(date)` / `MONTH(date)` / `DAY(date)` | 提取年、月、日| `YEAR('2025-04-05') → 2025` |
| `HOUR()`, `MINUTE()`, `SECOND()` | 提取时分秒 | —— |
| `DATEDIFF(date1, date2)` | 两个日期之间的天数差 |`DATEDIFF('2025-04-10', '2025-04-05') → 5` |
| `TIMESTAMPDIFF(unit, start, end)` | 按单位计算时间差(支持 YEAR,MONTH, DAY 等) | `TIMESTAMPDIFF(MONTH, d1, d2)` |
| `DATE_FORMAT(date, format)` | 格式化输出日期 |`DATE_FORMAT(NOW(), '%Y-%m') → '2025-04'` |
| `STR_TO_DATE(str, format)` | 将字符串转为日期类型 |`STR_TO_DATE('20250405', '%Y%m%d')` |
> 📌
常用格式符:
> - `%Y`: 四位年份;`%y`: 两位年份
> - `%m`: 两位月份;`%M`: 英文月份名
> - `%d`: 两位日期;`%H`: 24小时制;`%i`: 分钟;`%s`: 秒
类型转换函数(TypeConversion)
| `CAST(expr AS type)` |显式类型转换 | `CAST('2025-04-05' AS DATE)` |
| `CONVERT(expr, type)` | 类似 CAST,语法略有不同 | `CONVERT(varchar(10), getdate(), 120)`|
| 隐式转换 | 在比较或运算中自动进行 | `'123' +1 → 124`(MySQL) |
# 支持类型:`DATE`, `DATETIME`, `CHAR`, `VARCHAR`,
`INT`, `FLOAT`, `DECIMAL` 等。
条件与逻辑控制函数
简单判断
IF(condition, true_val, false_val)
例如IF(score >= 60, ‘及格’, ‘不及格’)`
多分支条件判断|
CASE WHEN … THEN … ELSE … END
CASE
WHEN score < 60 THEN '不及格'
WHEN score < 80 THEN '良好'
ELSE '优秀'
END
| `COALESCE(expr1, expr2, ...)` | 返回第一个非 NULL 的值 | `COALESCE(name, '未知')` |
| `NULLIF(expr1, expr2)` | 若两表达式相等则返回 NULL |`NULLIF(sales, 0)` |
窗口函数(WindowFunctions)
窗口函数不改变行数,可在每行返回一个基于“窗口”范围的结果。
1.排序类
| 函数 | 功能说明 |
| `ROW_NUMBER()` | 连续排序(无重复) |
| `RANK()` | 并列排序,留空位(如 1,1,3)|
| `DENSE_RANK()` | 并列排序,不留空位(如1,1,2) |
ROW_NUMBER() OVER (PARTITION BY dept ORDER BY salary DESC)
2.分布类
| 函数 | 功能说明 |
| `NTILE(n)` | 分组分成 n 个桶 |
| `PERCENT_RANK()` | 百分位排名 |
| `CUME_DIST()` | 累积分布 |
3. 聚合类(在窗口内使用)
| 函数 | 示例 |
| `SUM(col) OVER (PARTITION BY ...)` | 分区内求和 |
| `AVG(col) OVER (...)` | 分区内均值 |
| `MAX(col) OVER (...)` | 分区内最大值 |
4. 前后行访问
| 函数 | 功能 |
| `LAG(col, n)` | 取前第 n 行的值 |
| `LEAD(col, n)` | 取后第 n 行的值 |
LAG(sales, 1) OVER (ORDER BY month)
其他实用函数
| `ISNULL(expr)` / `exprIS NULL` |判断是否为空 |
| `IFNULL(expr, default)` 或 `NVL(expr, default)` |MySQL 中用 IFNULL,Oracle 用 NVL |
| `ROUND(num, decimals)` | 四舍五入到指定位数 | `ROUND(3.1415,2) → 3.14` |
| `FLOOR(num)` | 向下取整 | `FLOOR(3.9) → 3` |
| `CEIL(num)` / `CEILING(num)` | 向上取整 | `CEIL(3.1) → 4`|