Skip to main content

        常用函数 - Featured image

常用函数

常用的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`|