函数是封装了特定逻辑的程序,你不需要关心内部逻辑如何实现,它接受输入参数,经处理后返回输出结果。本文介绍了MySQL中常用函数类型,并演示如何查找全部函数的帮助示例。
文章目录
- [一、 系统函数](#一、 系统函数)
- [二、 字符串函数](#二、 字符串函数)
-
- [2.1 常用字符串函数](#2.1 常用字符串函数)
- [2.2 案例:姓名格式化 (CONCAT & UPPER)](#2.2 案例:姓名格式化 (CONCAT & UPPER))
- [2.3 案例:字符串截取(substr)](#2.3 案例:字符串截取(substr))
- [2.3 案例:信息替换 (REPLACE)](#2.3 案例:信息替换 (REPLACE))
- [三、 数学函数](#三、 数学函数)
-
- [3.1 常用数学函数](#3.1 常用数学函数)
- [3.1 案例:奖金计算 (ROUND & CEIL)](#3.1 案例:奖金计算 (ROUND & CEIL))
- [四、 时间日期函数](#四、 时间日期函数)
-
- [4.1 常用日期函数](#4.1 常用日期函数)
- [4.2 案例:计算工龄(DATEDIFF & ROUND)](#4.2 案例:计算工龄(DATEDIFF & ROUND))
- 五、查看函数列表及帮助
- [六、 性能提示](#六、 性能提示)
一、 系统函数
系统函数返回系统信息,这类函数在 MySQL 中主要用于环境审计 和权限确认。当你准备执行大批量数据操作前,通常会先通过这些函数确认当前的身份和环境。
常用系统函数:
| 函数 | 说明 | 示例查询 | 典型输出内容 |
|---|---|---|---|
DATABASE() |
返回当前会话所连接的默认数据库名。如果没有选择数据库,则返回 NULL。 |
SELECT DATABASE(); |
employees |
USER() |
返回当前 MySQL 会话的用户名和主机名。 | SELECT USER(); |
root@localhost |
VERSION() |
返回当前 MySQL 服务器的版本。 | SELECT VERSION(); |
8.0.32 |
sql
SELECT
USER() AS "当前用户",
DATABASE() AS "当前数据库",
VERSION() AS "服务器版本";

二、 字符串函数
字符串函数是使用频率最高的一类工具。它们不仅能帮助我们清洗不规范的录入数据,还能在生成结果时对字段进行格式化。
2.1 常用字符串函数
| 函数 | 功能描述 | 语法示例 |
|---|---|---|
CONCAT() |
合并两个或多个字符串 | CONCAT(s1, s2, ...) |
UPPER()/LOWER() |
将字符串转换为全大写/小写 | UPPER(str)/LOWER(str) |
SUBSTRING() |
截取字符串(索引从 1 开始) | SUBSTRING(str, start, len) |
LENGTH() |
返回字符串的字节长度 | LENGTH(str) |
TRIM() |
去除字符串左右两侧的空格 | TRIM(str) |
REPLACE() |
替换字符串中的指定子串 | REPLACE(str, from, to) |
2.2 案例:姓名格式化 (CONCAT & UPPER)
需求:在 employees 表中,名字分两列存储,可以将其合并,并统一格式(例如姓氏大写,名字首字母大写)。
sql
SELECT
emp_no 员工号,
CONCAT(first_name, ' ', UPPER(last_name)) 全名
FROM employees;

2.3 案例:字符串截取(substr)
需求:根据员工入职年份和编号后三位生成一个识别码。
这里需要用到字符串截取函数substr,其语法是 SUBSTRING(str, start, len),其中截取长度len可以省略:
sql
SELECT
emp_no,
CONCAT(substr(hire_date, 1), '-', SUBSTRING(emp_no, -3)) 识别码
FROM employees;

2.3 案例:信息替换 (REPLACE)
需求:导出数据时,对员工编号进行部分遮掩。
sql
SELECT
first_name,
REPLACE(emp_no, '10', '**') 员工号
FROM employees;

三、 数学函数
数字函数主要用于处理数值计算,例如绩效奖金计算、平均薪资取整以及生成随机抽奖名单。
3.1 常用数学函数
| 函数 | 功能描述 | 语法示例 | 结果示例 |
|---|---|---|---|
ABS() |
返回绝对值 | ABS(-10) |
10 |
CEIL() |
向上取整(进一法) | CEIL(1.1) |
2 |
FLOOR() |
向下取整(去尾法) | FLOOR(1.9) |
1 |
ROUND() |
四舍五入,可指定小数位 | ROUND(1.58, 1) |
1.6 |
TRUNCATE() |
截断,不进行四舍五入 | TRUNCATE(1.58, 1) |
1.5 |
MOD() |
取模(求余数) | MOD(10, 3) |
1 |
RAND() |
生成 0 到 1 之间的随机数 | RAND() |
0.723... |
POW() / POWER() |
指数运算(次幂) | POW(2, 3) |
8 |
SQRT() |
开平方根 | SQRT(16) |
4 |
3.1 案例:奖金计算 (ROUND & CEIL)
需求:为每个员工发放工资额5%的奖金。
sql
SELECT
emp_no,
salary 工资,
ROUND(salary * 0.05, 2) 奖金-- 计算 5% 的奖金并四舍五入保留两位小数
FROM salaries;

四、 时间日期函数
日期函数也是使用率极高的函数类型,它能够将数据库中"时间"转化为你需要的格式,还可以进行时间差计算。
4.1 常用日期函数
| 函数 | 功能描述 | 语法示例 | 结果示例 |
|---|---|---|---|
NOW() |
返回当前的日期和时间 | NOW() |
2026-03-17 21:35:00 |
CURDATE() |
返回当前日期(不含时间) | CURDATE() |
2026-03-17 |
CURTIME() |
返回当前时间(不含日期) | CURTIME() |
21:35:00 |
YEAR() |
提取日期的年份 | YEAR('2026-03-17') |
2026 |
MONTH() |
提取日期的月份 (1-12) | MONTH('2026-03-17') |
3 |
DAY() |
提取日期的天数 (1-31) | DAY('2026-03-17') |
17 |
DATEDIFF() |
计算两个日期之间的天数差 | DATEDIFF('2026-03-20', '2026-03-17') |
3 |
DATE_ADD() |
对日期增加指定的时间间隔 | DATE_ADD('2026-03-17', INTERVAL 1 MONTH) |
2026-04-17 |
DATE_FORMAT() |
按指定格式输出日期(转为字符串) | DATE_FORMAT(NOW(), '%Y-%m-%d') |
2026-03-17 |
LAST_DAY() |
返回该月最后一天的日期 | LAST_DAY('2026-02-01') |
2026-02-28 |
4.2 案例:计算工龄(DATEDIFF & ROUND)
需求:统计员工入职至今的天数,并估算工龄(年)。
sql
SELECT
emp_no,
hire_date,
DATEDIFF(CURDATE(), hire_date) AS total_days,
ROUND(DATEDIFF(CURDATE(), hire_date) / 365, 1) AS years_of_service
FROM employees ;

五、查看函数列表及帮助
MySQL 内置了函数帮助手册,当你不知道某函数具体用法时,通过help语句即可查阅语法及示例:
- 查看分类 :输入
help functions;查看所有可用的函数分类。 - 查看具体类目 :输入
help 'string functions';获取所有字符函数列表。 - 精准查阅语法 :如果你不记得某个函数怎么用,直接输入
help 函数名;,MySQL 会直接给出语法定义和演示代码。
sql
help functions;
help 'string functions';
help CONCAT;

六、 性能提示
如果某列上没有基于函数的索引,尽量避免在 WHERE 子句中对该列使用函数,这会导致 MySQL 无法利用索引,从而引发全表扫描。
以下两条查询,其中hire_date上有索引:
-
❌ 慢查询(索引失效) : MySQL 对每一行记录运行 YEAR() 函数,无法使用索引。
SELECT * FROM employees WHERE YEAR(hire_date) = 1985; -
✅ 快查询(利用索引) : 直接在索引树上搜索范围,速度极快。
SELECT * FROM employees WHERE hire_date BETWEEN '1985-01-01' AND '1985-12-31';