1. MySQL内置函数概述
MySQL内置函数是数据库系统中预定义的一系列功能模块,它们可以直接在SQL语句中调用,用于数据处理、计算和转换。这些函数就像是数据库工具箱里的各种工具,能够帮助我们高效地完成各种常见的数据操作任务。
作为关系型数据库的核心组件,MySQL内置函数主要分为以下几大类:
- 字符串函数:处理文本数据
- 数值函数:数学运算和数值处理
- 日期和时间函数:处理日期和时间数据
- 聚合函数:对多行数据进行统计计算
- 控制流函数:实现条件逻辑
- 系统信息函数:获取数据库和系统信息
提示:MySQL 5.7和8.0版本在函数功能上有显著差异,特别是窗口函数在8.0中才被完整支持。在实际使用时需要注意版本兼容性问题。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 字符串处理函数详解
2.1 基础字符串操作
CONCAT()函数是最常用的字符串连接函数,它可以将多个字符串拼接成一个:
sql复制SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM employees;
SUBSTRING()或SUBSTR()函数用于提取子字符串:
sql复制SELECT SUBSTRING('MySQL内置函数', 6, 4); -- 返回"内置函数"
LENGTH()和CHAR_LENGTH()都能获取字符串长度,但处理多字节字符时表现不同:
sql复制SELECT LENGTH('函数'), CHAR_LENGTH('函数'); -- 返回6和2
2.2 字符串搜索与替换
LOCATE()和INSTR()函数用于查找子字符串位置:
sql复制SELECT LOCATE('SQL', 'MySQL内置函数'); -- 返回3
REPLACE()函数实现全局替换:
sql复制SELECT REPLACE('MySQL数据库', '数据', '内置函数'); -- 返回"MySQL内置函数库"
2.3 字符串格式化函数
TRIM()系列函数去除空白字符:
sql复制SELECT TRIM(' MySQL '), LTRIM(' MySQL'), RTRIM('MySQL ');
FORMAT()函数实现数字格式化:
sql复制SELECT FORMAT(1234567.891, 2); -- 返回"1,234,567.89"
3. 数值计算函数应用
3.1 基本数学运算
ROUND()函数实现四舍五入:
sql复制SELECT ROUND(3.14159, 2); -- 返回3.14
CEIL()和FLOOR()分别向上和向下取整:
sql复制SELECT CEIL(3.14), FLOOR(3.99); -- 返回4和3
3.2 高级数学函数
RAND()生成随机数,常与FLOOR配合使用:
sql复制SELECT FLOOR(RAND() * 100); -- 生成0-99的随机整数
POW()计算幂次方:
sql复制SELECT POW(2, 10); -- 返回1024
3.3 数值处理技巧
GREATEST()和LEAST()比较多个数值:
sql复制SELECT GREATEST(10, 20, 30), LEAST(10, 20, 30);
MOD()取模运算:
sql复制SELECT MOD(15, 4); -- 返回3
4. 日期时间函数实战
4.1 日期获取与计算
NOW()获取当前日期时间:
sql复制SELECT NOW(); -- 返回"2023-07-20 15:30:45"
DATE_ADD()和DATE_SUB()进行日期加减:
sql复制SELECT DATE_ADD(NOW(), INTERVAL 1 MONTH);
DATEDIFF()计算日期差:
sql复制SELECT DATEDIFF('2023-12-31', '2023-01-01'); -- 返回364
4.2 日期格式化
DATE_FORMAT()自定义日期显示:
sql复制SELECT DATE_FORMAT(NOW(), '%Y年%m月%d日 %H时%i分');
4.3 时间戳转换
UNIX_TIMESTAMP()和FROM_UNIXTIME()实现时间戳转换:
sql复制SELECT UNIX_TIMESTAMP(), FROM_UNIXTIME(1689840000);
5. 聚合函数深度解析
5.1 基本聚合函数
COUNT()统计行数:
sql复制SELECT COUNT(*) FROM employees WHERE department = 'IT';
SUM()、AVG()、MAX()、MIN()等基本统计:
sql复制SELECT AVG(salary), MAX(salary) FROM employees;
5.2 分组与过滤
GROUP_CONCAT()合并分组结果:
sql复制SELECT department, GROUP_CONCAT(employee_name)
FROM employees GROUP BY department;
HAVING子句过滤分组结果:
sql复制SELECT department, AVG(salary)
FROM employees
GROUP BY department
HAVING AVG(salary) > 5000;
6. 条件判断与流程控制
6.1 IF函数
基本条件判断:
sql复制SELECT IF(salary > 10000, '高薪', '普通') FROM employees;
6.2 CASE表达式
多条件分支:
sql复制SELECT
CASE
WHEN score >= 90 THEN '优秀'
WHEN score >= 80 THEN '良好'
ELSE '一般'
END AS grade
FROM students;
6.3 NULL值处理
COALESCE()返回第一个非NULL值:
sql复制SELECT COALESCE(middle_name, '') FROM persons;
IFNULL()简化NULL判断:
sql复制SELECT IFNULL(bonus, 0) FROM salaries;
7. 系统信息函数应用
7.1 连接信息
CONNECTION_ID()获取连接ID:
sql复制SELECT CONNECTION_ID();
USER()和CURRENT_USER()获取用户信息:
sql复制SELECT USER(), CURRENT_USER();
7.2 数据库信息
DATABASE()获取当前数据库:
sql复制SELECT DATABASE();
VERSION()获取MySQL版本:
sql复制SELECT VERSION();
8. 窗口函数(MySQL 8.0+)
8.1 排名函数
ROW_NUMBER()、RANK()、DENSE_RANK():
sql复制SELECT
employee_name,
salary,
RANK() OVER (ORDER BY salary DESC) AS salary_rank
FROM employees;
8.2 窗口聚合
SUM() OVER实现累计求和:
sql复制SELECT
month,
revenue,
SUM(revenue) OVER (ORDER BY month) AS cumulative_revenue
FROM sales;
8.3 分区计算
PARTITION BY子句实现分组计算:
sql复制SELECT
department,
employee_name,
salary,
AVG(salary) OVER (PARTITION BY department) AS dept_avg_salary
FROM employees;
9. 函数性能优化建议
-
避免在WHERE子句中使用函数:这会导致索引失效
sql复制-- 不推荐 SELECT * FROM orders WHERE DATE_FORMAT(order_date, '%Y-%m') = '2023-07'; -- 推荐 SELECT * FROM orders WHERE order_date >= '2023-07-01' AND order_date < '2023-08-01'; -
注意隐式类型转换:确保函数参数类型匹配
sql复制-- 字符串比较可能导致全表扫描 SELECT * FROM products WHERE product_id = 123; -- 明确类型转换更高效 SELECT * FROM products WHERE product_id = CAST('123' AS UNSIGNED); -
合理使用存储过程:复杂逻辑考虑封装为存储过程
-
函数索引策略:MySQL 8.0支持函数索引
sql复制CREATE INDEX idx_name_lower ON employees ((LOWER(last_name)));
10. 常见问题解决方案
10.1 时区问题处理
设置会话时区:
sql复制SET time_zone = '+08:00';
转换时区:
sql复制SELECT CONVERT_TZ(NOW(), 'UTC', 'Asia/Shanghai');
10.2 字符集与排序规则
强制指定字符集:
sql复制SELECT CONVERT('MySQL' USING utf8mb4);
改变字符串排序规则:
sql复制SELECT 'a' = 'A' COLLATE utf8mb4_general_ci; -- 返回1(不区分大小写)
SELECT 'a' = 'A' COLLATE utf8mb4_bin; -- 返回0(区分大小写)
10.3 JSON函数(MySQL 5.7+)
JSON数据提取:
sql复制SELECT JSON_EXTRACT('{"name": "John", "age": 30}', '$.name');
JSON路径查询:
sql复制SELECT column->'$.address.city' FROM users;
