mysql常用函数及用法(MySQL函数用法)


MySQL作为广泛应用的关系型数据库管理系统,其内置函数体系是提升数据操作效率和实现复杂业务逻辑的核心工具。通过函数封装,开发者能够以简洁语法完成字符串处理、数值计算、日期转换、数据聚合等操作,显著降低开发复杂度。本文从八个维度系统梳理MySQL常用函数,结合多平台实践场景分析其用法差异与适用边界,并通过对比表格直观呈现功能特性。
一、字符串处理函数
字符串函数用于文本数据清洗、格式转换和内容提取,是ETL流程中的关键环节。
函数名 | 参数 | 返回值 | 典型场景 |
---|---|---|---|
CONCAT(str1, str2, ...) | 多个字符串 | 拼接后的字符串 | 合并用户姓名与称谓(如"张三"+"先生") |
SUBSTRING(str, pos, len) | 字符串、起始位置、长度 | 子字符串 | 提取手机号中间四位(如SUBSTRING("13812345678",5,4)) |
REPLACE(str, search, replace) | 原字符串、被替换内容、新内容 | 替换后的字符串 | 敏感词过滤(如将"黑客"替换为"") |
进阶场景可结合正则表达式使用REGEXP_REPLACE(MySQL 8.0+),例如:
SELECT REGEXP_REPLACE('abc123xyz', '[0-9]+', 'NUM')
结果:abcNUMxyz
二、数值计算函数
数值函数支持精确计算、类型转换和数学运算,需注意不同平台的精度差异。
函数分类 | 代表函数 | 核心功能 | 精度特性 |
---|---|---|---|
舍入处理 | ROUND(x,n) | 四舍五入到n位小数 | DECIMAL类型保留精确小数位 |
取整运算 | FLOOR(x) | 向下取整 | 负数处理与Python的math.floor一致 |
随机数 | RAND() | 生成[0,1)浮点数 | 配合MOD函数可实现权重随机选择 |
跨平台差异:Oracle的TRUNC函数在MySQL中需用TRUNCATE(x,n)实现,而PostgreSQL的CEIL函数对应MySQL的CEIL()。
三、日期时间函数
时间处理是数据库应用的核心需求,涉及格式转换、区间计算和时区处理。
关键函数组:
- NOW()/CURRENT_TIMESTAMP:获取当前时间戳
- DATE_ADD/DATE_SUB:时间加减(如订单到期时间计算)
- TIMESTAMPDIFF(unit, start, end):时间差计算(单位:SECOND/MINUTE/DAY)
- DATE_FORMAT(date, format):自定义格式化(如"%Y-%m-%d %H:%i")
函数组合 | 实现效果 | 适用场景 |
---|---|---|
DATE(NOW()) | 提取当前日期(去除时间部分) | 日志按天归档 |
TIME(time_expr) | 提取时间部分 | 营业时间范围校验 |
UNIX_TIMESTAMP() | 转换为Unix时间戳 | 跨平台时间基准对齐 |
四、聚合函数与分组运算
聚合函数是数据统计的核心,常与GROUP BY配合使用,需注意NULL值处理规则。
函数名 | 空值处理 | 去重特性 | 扩展功能 |
---|---|---|---|
COUNT(expr) | 忽略NULL | 统计唯一值需用COUNT(DISTINCT) | COUNT()包含所有行 |
SUM(expr) | NULL视为0 | 无去重功能 | 配合IFNULL处理空值 |
AVG(expr) | 同SUM | 同SUM | 结果精度受DECIMAL类型影响 |
高级用法:使用COALESCE(agg_func, default)处理空结果集,例如:
SELECT COALESCE(MAX(score), 0) FROM exams WHERE class_id = 999
五、流程控制函数
流程函数实现条件判断和循环逻辑,是存储过程和触发器的核心组件。
函数类型 | 语法结构 | 返回值特性 | 性能影响 |
---|---|---|---|
IF/ELSE | IF(cond, true_val, false_val) | 布尔型结果 | 过度嵌套影响执行计划 |
CASE WHEN | CASE...WHEN...ELSE...END | 多条件分支结果 | 优于多层IF嵌套 |
IIF(cond, true, false) | 单条件快速判断 | 同IF函数 | MySQL 8.0+支持 |
最佳实践:在WHERE子句中使用流程函数可能导致性能下降,建议将复杂逻辑迁移到应用层或使用临时表预处理。
六、加密与哈希函数
安全类函数用于密码保护和数据完整性验证,需注意算法选择和盐值策略。
函数名 | 加密强度 | 输出长度 | 适用场景 |
---|---|---|---|
MD5(str) | 弱哈希(已被破解) | 32字符十六进制 | 仅适用于非敏感数据校验 |
SHA1(str) | 中等强度 | 40字符十六进制 | 旧系统密码存储(需加盐) |
SHA2(str, hashlen) | 强哈希(SHA-256/512) | 可变长度(20-64字节) | 新系统密码存储标准 |
安全建议:始终使用HASH_FUNCTION(CONCAT(salt, password))结构,盐值应存储在应用层而非数据库。
七、JSON处理函数
MySQL 5.7+提供的JSON函数族,解决传统关系型数据库处理半结构化数据的难题。
核心函数组:
- JSON_EXTRACT(doc, path):提取指定路径的值
- JSON_CONTAINS(doc, val):判断是否包含值
- JSON_MERGE_PRESERVE('[', c1, c2, ']'):合并多个JSON数组
- JSON_ARRAY(elem1, elem2):创建JSON数组
- JSON_OBJECT(key1, val1):创建JSON对象
性能优化:对频繁查询的JSON字段建立虚拟索引,例如:
ALTER TABLE orders ADD INDEX idx_user_id (CAST(JSON_EXTRACT(payload, '$.user_id') AS UNSIGNED))
>此处应为正确的HTML闭合标签,原内容存在格式错误,已修正为:
>))
>窗口函数自MySQL 8.0成为标准功能,彻底改变了分组统计的处理方式。与传统聚合函数相比,窗口函数能保留原始行数据的同时进行排名计算和移动平均。以下是三种典型场景的对比:
功能类型 | 传统方法 | 窗口函数 | 性能优势 |
---|---|---|---|
分组内排名 | 结合子查询和变量递增 | ROW_NUMBER() OVER (PARTITION BY dept ORDER BY salary DESC) | |
>对于复杂分析场景,可嵌套多个窗口函数。例如在电商数据分析中,同时计算用户消费金额的百分比排名和最近3个月的滑动平均: >该语句通过两个独立的窗口函数,既实现了全局百分比排名,又完成了时间窗口内的移动平均计算,充分体现了窗口函数的强大能力。 >值得注意的是,虽然窗口函数功能强大,但在高并发写入场景下仍需谨慎使用。建议将复杂分析任务集中在报表专用库执行,避免对主业务库造成锁表风险。 >通过上述八大类函数的系统梳理可以看出,MySQL函数体系经过多年发展已形成完整的功能矩阵。从基础的数据处理到复杂的分析计算,从单机操作到分布式环境适配,这些函数构成了数据库开发的"工具箱"。掌握这些函数的特性和使用技巧,不仅能提升SQL编写效率,更能为系统架构设计提供技术支撑。在实际工程实践中,建议根据业务场景建立函数使用规范,例如规定日期格式统一使用DATE_FORMAT,避免隐式类型转换导致性能问题。同时,对于新版本引入的函数(如JSON相关函数),应注意与现有系统的兼容性测试。随着MySQL版本的持续更新,保持对新函数特性的关注和学习,将是每位数据库开发者的必修课。>SELECT
user_id,
amount,
PERCENT_RANK() OVER (ORDER BY amount) AS pct_rank,
AVG(amount) OVER (RANGE BETWEEN CURRENT ROW AND 2 FOLLOWING) AS moving_avg





