以下是 MySQL 函数的详细分类说明及用法示例,涵盖常见函数及核心场景。由于函数数量庞大,本文重点介绍 高频函数,完整列表请参考 MySQL 官方文档。
一、字符串函数
1. CONCAT(str1, str2, ...)
- 功能: 拼接多个字符串。
- 示例:sql复制SELECT CONCAT(‘Hello’, ‘ ‘, ‘World’); — 输出 ‘Hello World’ SELECT CONCAT(first_name, ‘ ‘, last_name) AS full_name FROM users;
- 注意: 若任一参数为
NULL
,结果返回NULL
。用CONCAT_WS()
处理含分隔符的拼接。
2. SUBSTRING(str, start, length)
- 功能: 截取子字符串。
- 示例:sql复制SELECT SUBSTRING(‘MySQL’, 3, 2); — 输出 ‘SQ’ SELECT SUBSTRING(‘2023-10-25’, 1, 4); — 输出 ‘2023’
- 简写:
SUBSTR()
是别名。
3. REPLACE(str, from_str, to_str)
- 功能: 替换字符串中的内容。
- 示例:sql复制SELECT REPLACE(‘I like apples’, ‘apples’, ‘oranges’); — 输出 ‘I like oranges’
4. LENGTH(str)
与 CHAR_LENGTH(str)
- 区别:
LENGTH()
: 返回字节数(受字符集影响)。CHAR_LENGTH()
: 返回字符数。
- 示例:sql复制SELECT LENGTH(‘中国’); — UTF-8 下输出 6(每个汉字占3字节) SELECT CHAR_LENGTH(‘中国’); — 输出 2
二、数值函数
1. ROUND(number, decimals)
- 功能: 四舍五入到指定小数位。
- 示例:sql复制SELECT ROUND(3.1415, 2); — 输出 3.14 SELECT ROUND(123.456, -1); — 输出 120(十位四舍五入)
2. CEIL()
与 FLOOR()
- 功能:
CEIL()
: 向上取整。FLOOR()
: 向下取整。
- 示例:sql复制SELECT CEIL(2.3); — 输出 3 SELECT FLOOR(2.7); — 输出 2
3. RAND()
- 功能: 生成 0~1 之间的随机数。
- 示例:sql复制SELECT RAND(); — 输出类似 0.654321 SELECT FLOOR(RAND() * 100); — 生成 0~99 的随机整数
三、日期时间函数
1. NOW()
与 CURDATE()
- 区别:
NOW()
: 返回当前日期和时间(如2023-10-25 14:30:00
)。CURDATE()
: 仅返回当前日期(如2023-10-25
)。
- 示例:sql复制SELECT NOW(); — 获取当前时间戳 SELECT CURDATE(); — 获取当前日期
2. DATE_ADD(date, INTERVAL expr unit)
- 功能: 日期加法。
- 示例:sql复制SELECT DATE_ADD(NOW(), INTERVAL 7 DAY); — 7天后的时间 SELECT DATE_ADD(‘2023-12-31’, INTERVAL 1 MONTH); — 输出 ‘2024-01-31’
3. DATEDIFF(date1, date2)
- 功能: 计算两个日期之间的天数差。
- 示例:sql复制SELECT DATEDIFF(‘2023-10-31’, ‘2023-10-25’); — 输出 6
4. DATE_FORMAT(date, format)
- 功能: 格式化日期。
- 常用格式符:
%Y
: 四位年份(如 2023)%m
: 两位月份(01~12)%d
: 两位日期(01~31)%H
: 24小时制小时(00~23)
- 示例:sql复制SELECT DATE_FORMAT(NOW(), ‘%Y-%m-%d %H:%i:%s’); — 输出 ‘2023-10-25 14:30:00’
四、聚合函数
1. SUM(column)
- 功能: 计算数值列的总和。
- 示例:sql复制SELECT SUM(sales) FROM orders WHERE year = 2023;
2. COUNT(expression)
- 功能: 统计行数。
- 区别:
COUNT(*)
: 统计所有行(包括NULL
)。COUNT(column)
: 忽略该列的NULL
值。
- 示例:sql复制SELECT COUNT(*) FROM users; — 总用户数 SELECT COUNT(DISTINCT country) FROM customers; — 去重统计国家数
3. GROUP_CONCAT(expr)
- 功能: 合并分组中的字符串。
- 示例:sql复制SELECT department_id, GROUP_CONCAT(name) FROM employees GROUP BY department_id; — 输出每个部门的员工姓名列表
五、条件函数
1. IF(condition, value_if_true, value_if_false)
- 功能: 简单条件判断。
- 示例:sql复制SELECT IF(score >= 60, ‘Pass’, ‘Fail’) AS result FROM exams;
2. CASE WHEN
- 功能: 多条件分支。
- 示例:sql复制SELECT CASE WHEN age < 18 THEN ‘Minor’ WHEN age BETWEEN 18 AND 65 THEN ‘Adult’ ELSE ‘Senior’ END AS age_group FROM users;
3. COALESCE(value1, value2, ...)
- 功能: 返回第一个非
NULL
值。 - 示例:sql复制SELECT COALESCE(middle_name, ‘N/A’) FROM users; — 若 middle_name 为 NULL,显示 ‘N/A’
六、窗口函数(MySQL 8.0+)
1. ROW_NUMBER()
- 功能: 为分组内的行生成序号。
- 示例:sql复制SELECT name, salary, ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS rank FROM employees; — 按部门分组,按工资降序排名
2. RANK()
与 DENSE_RANK()
- 区别:
RANK()
: 允许并列排名,后续序号跳跃(如 1,1,3)。DENSE_RANK()
: 允许并列排名,后续序号连续(如 1,1,2)。
七、JSON 函数(MySQL 5.7+)
1. JSON_EXTRACT(json_doc, path)
- 功能: 提取 JSON 字段。
- 简写语法:
->
- 示例:sql复制SELECT JSON_EXTRACT(‘{“name”: “John”, “age”: 30}’, ‘$.name’); — 输出 “John” SELECT data->’$.age’ FROM users; — 等效写法
2. JSON_ARRAYAGG(expr)
- 功能: 将多行数据聚合为 JSON 数组。
- 示例:sql复制SELECT department_id, JSON_ARRAYAGG(name) FROM employees GROUP BY department_id;
八、加密函数
1. MD5(str)
- 功能: 计算 MD5 哈希值(不推荐用于密码存储)。
- 示例:sql复制SELECT MD5(‘password’); — 输出 32位哈希字符串
2. SHA2(str, hash_length)
- 功能: 计算 SHA-2 哈希值(更安全)。
- 示例:sql复制SELECT SHA2(‘password’, 256); — 输出 SHA-256 哈希值
注意事项
- 性能优化:
- 避免在
WHERE
或JOIN
条件中对字段使用函数(可能导致索引失效)。 - 示例错误写法:
SELECT * FROM logs WHERE DATE_FORMAT(create_time, '%Y-%m') = '2023-10'
。 - 正确优化:
SELECT * FROM logs WHERE create_time BETWEEN '2023-10-01' AND '2023-10-31'
。
- 避免在
- 版本兼容性:
- 窗口函数、JSON 函数需 MySQL 8.0+ 或 5.7+ 支持。
- NULL 处理:
- 大多数函数遇到
NULL
参数会返回NULL
,使用IFNULL()
或COALESCE()
处理默认值。
- 大多数函数遇到
THE END