MySQL 常用函数实操指南:从基础到实战案例

在 MySQL 数据库操作中,函数是提升数据处理效率的核心工具。无论是日期计算、字符串拼接,还是数据加密,掌握常用函数能让复杂需求变得简单。本文将从实际场景出发,梳理日期、字符串、数学及其他高频函数的用法,每个函数都附带可直接运行的代码案例,帮你快速上手。

一、日期函数:处理时间维度数据

日期函数是业务开发中的 "高频工具",比如统计近 7 天订单、筛选 2 分钟内的新留言等场景都离不开它。以下是最常用的 6 类日期函数及实操案例。

1. 获取当前时间信息

无需手动输入时间,用函数直接获取系统当前时间,避免人工录入误差。

  • 获取年月日current_date(),返回格式YYYY-MM-DD

    mysql

    复制代码
    select current_date();
    -- 结果:2024-10-01
  • 获取时分秒current_time(),返回格式HH:MM:SS

    mysql

    复制代码
    select current_time();
    -- 结果:14:25:30
  • 获取完整时间current_timestamp()now(),两者功能一致,返回YYYY-MM-DD HH:MM:SS

    mysql

    复制代码
    select now();
    -- 结果:2024-10-01 14:26:15

2. 日期 / 时间增减:date_add()date_sub()

在指定日期上增加或减少时间,支持天、分钟、秒等单位,灵活应对 "有效期计算""超时判断" 等场景。

  • 加时间date_add(原始日期, interval 数值 单位)

    mysql

    复制代码
    -- 给2024-10-01加5天
    select date_add('2024-10-01', interval 5 day);
    -- 结果:2024-10-06
    
    -- 给2024-10-01 12:00:00加30分钟
    select date_add('2024-10-01 12:00:00', interval 30 minute);
    -- 结果:2024-10-01 12:30:00
  • 减时间date_sub(原始日期, interval 数值 单位)

    mysql

    复制代码
    -- 给2024-10-01减7天
    select date_sub('2024-10-01', interval 7 day);
    -- 结果:2024-09-24

3. 计算日期差:datediff()

统计两个日期之间的天数差,结果为 "前日期 - 后日期",正数表示前者晚,负数表示前者早。

mysql

复制代码
-- 计算2024-10-01与2024-09-20的天数差
select datediff('2024-10-01', '2024-09-20');
-- 结果:11(10月1日比9月20日晚11天)

select datediff('2024-09-20', '2024-10-01');
-- 结果:-11(9月20日比10月1日早11天)

4. 实战案例:筛选 2 分钟内的新留言

需求:从msg留言表中,找出 "发布时间 + 2 分钟" 仍在当前时间之前的记录(即 2 分钟内发布的留言)。

  1. 先创建msg表并插入数据:

    mysql

    复制代码
    create table msg(
      id int primary key auto_increment,
      content varchar(30) not null,
      sendtime datetime
    );
    -- 插入3条留言,sendtime为当前时间
    insert into msg (content, sendtime) values 
      ('MySQL函数真好用', now()),
      ('今天学到新技巧了', now()),
      ('这是1小时前的旧留言', date_sub(now(), interval 1 hour));
  2. 筛选 2 分钟内的留言: mysql

    复制代码
    select * from msg 
    where date_add(sendtime, interval 2 minute) > now();
    -- 结果:只显示前2条刚插入的新留言,旧留言被过滤

二、字符串函数:处理文本类数据

字符串函数常用于数据格式化(如 "XXX 的语文成绩是 XXX 分")、内容匹配、空格清理等场景,以下是开发中最常用的 8 类函数。

1. 查看字符集:charset()

确认字符串或字段的字符集,避免因编码不一致导致乱码。

mysql

复制代码
-- 查看字符串的字符集
select charset('MySQL学习');
-- 结果:utf8

-- 查看表中字段的字符集(以student表的name字段为例)
select charset(name) from student;
-- 结果:所有行均返回utf8

2. 拼接字符串:concat()

将多个字符串 / 字段拼接成一个,支持文本与数字混合拼接。

mysql

复制代码
-- 拼接固定文本和数字
select concat('Hello', 'MySQL', 2024);
-- 结果:HelloMySQL2024

-- 实战场景:格式化显示学生成绩(exam_result表含name、chinese、math字段)
select concat(name, '的语文是', chinese, '分,数学是', math, '分') as 成绩详情
from exam_result;
-- 结果:唐三藏的语文是134分,数学是98分

3. 计算字节数:length()

统计字符串占用的字节数,注意:UTF8 编码下,1 个中文占 3 字节,1 个英文 / 数字占 1 字节。

mysql

复制代码
-- 计算中文+英文的字节数
select length('MySQL学习');
-- 结果:9(MySQL是5个字母,占5字节;"学习"是2个中文,占6字节,合计5+6=11?此处修正:MySQL是5字符,占5字节,"学习"2字符占6字节,总计11,此前示例有误,以实际计算为准)

-- 查看学生姓名的字节数(student表)
select name, length(name) as 姓名字节数 from student;
-- 结果:张三 → 6字节(2个中文×3)

4. 查找子串位置:instr()

判断子串是否在主串中,返回子串的起始下标(从 1 开始),若不存在则返回 0。

mysql

复制代码
-- 查找"函数"在主串中的位置
select instr('MySQL常用函数指南', '函数');
-- 结果:6("函数"从第6个字符开始)

-- 查找不存在的子串
select instr('MySQL常用函数指南', 'SQL Server');
-- 结果:0

5. 大小写转换:ucase()lcase()

将字符串统一转为大写或小写,常用于不区分大小写的查询场景。

mysql

复制代码
-- 转为大写
select ucase('mysql');
-- 结果:MYSQL

-- 转为小写
select lcase('MYSQL FUNCTION');
-- 结果:mysql function

6. 截取字符串:left()right()substring()

  • left(主串, 长度):从左侧截取指定长度的字符
  • right(主串, 长度):从右侧截取指定长度的字符
  • substring(主串, 起始下标, 长度):从指定下标开始,截取指定长度(下标从 1 开始)

mysql

复制代码
-- 左侧截取3个字符
select left('MySQL函数', 3);
-- 结果:MyS

-- 右侧截取2个字符
select right('MySQL函数', 2);
-- 结果:函数

-- 从第4个字符开始,截取3个字符
select substring('MySQL函数指南', 4, 3);
-- 结果:QL函

7. 替换字符:replace()

将主串中的指定子串替换为新字符,常用于敏感词过滤、内容修正。

mysql

复制代码
-- 将"MySQL"替换为"数据库"
select replace('学习MySQL很重要', 'MySQL', '数据库');
-- 结果:学习数据库很重要

-- 实战场景:将emp表ename字段中的"S"替换为"上海"
select replace(ename, 'S', '上海') as 替换后姓名 from emp;
-- 结果:SMITH → 上海MITH

8. 清理空格:ltrim()rtrim()trim()

  • ltrim(字符串):清除左侧空格
  • rtrim(字符串):清除右侧空格
  • trim(字符串):清除两侧空格

mysql

复制代码
-- 清除左侧空格
select ltrim('   左侧有空格  ') as 结果;
-- 结果:左侧有空格  

-- 清除两侧空格
select trim('   两侧有空格  ') as 结果;
-- 结果:两侧有空格

三、数学函数:处理数值计算

数学函数主要用于数值的计算与格式化,如绝对值、取整、随机数生成等,以下是 4 类常用函数。

1. 绝对值:abs()

返回数值的绝对值,常用于计算差值(如距离、误差)。

mysql

复制代码
select abs(-100); -- 结果:100
select abs(25.5); -- 结果:25.5

2. 取整:ceiling()floor()

  • ceiling(数值):向上取整(无论小数部分是多少,都进 1)
  • floor(数值):向下取整(无论小数部分是多少,都舍掉)

mysql

复制代码
-- 向上取整
select ceiling(3.1); -- 结果:4
select ceiling(-2.9); -- 结果:-2

-- 向下取整
select floor(3.9); -- 结果:3
select floor(-2.1); -- 结果:-3

3. 保留小数:format()

按指定位数保留小数,自动四舍五入,返回字符串格式(常用于金额、成绩格式化)。

mysql

复制代码
-- 保留2位小数
select format(123.456, 2); -- 结果:123.46(四舍五入)
select format(78.9, 2); -- 结果:78.90(补0)

4. 随机数:rand()

生成 0~1 之间的随机小数(左闭右开),可通过乘法扩展到指定范围。

mysql

复制代码
-- 生成0~1的随机数
select rand(); -- 结果:0.78956(每次运行结果不同)

-- 生成1~10的随机整数(先×10,再保留0位小数)
select format(rand()*10, 0) as 1到10的随机数;
-- 结果:5(每次运行结果不同)

四、其他高频函数:用户、加密与空值处理

除了上述三类函数,还有一些 "特殊功能" 函数,在用户管理、数据安全场景中非常实用。

1. 查看当前用户:user()

返回当前登录 MySQL 的用户名及主机,用于权限排查。

mysql

复制代码
select user();
-- 结果:root@localhost(root是用户名,localhost是主机)

2. 密码加密:md5()

对字符串进行 MD5 加密,生成 32 位的十六进制字符串,常用于密码存储(避免明文泄露)。

实战场景:创建用户表并加密存储密码
  1. 创建user_info表:

    mysql

    复制代码
    create table user_info(
      id int primary key auto_increment,
      username varchar(20) not null,
      password char(32) not null -- MD5加密后是32位,用char(32)存储
    );
  2. 插入加密后的密码(原始密码为 123456): mysql

    复制代码
    insert into user_info (username, password) 
    values ('zhangsan', md5('123456'));
  3. 验证密码(查询时需对输入的密码也进行 MD5 加密): mysql

    复制代码
    select id, username from user_info 
    where password = md5('123456');
    -- 结果:返回zhangsan的记录(密码匹配)

3. 空值处理:ifnull()

如果第一个值为null,则返回第二个值;否则返回第一个值,常用于避免null导致的计算错误。

mysql

复制代码
-- 第一个值为null,返回第二个值
select ifnull(null, '空值时显示这个'); -- 结果:空值时显示这个

-- 第一个值不为null,返回第一个值
select ifnull(100, '空值时显示这个'); -- 结果:100

-- 实战场景:计算学生总分(若math字段为null,按0分计算)
select name, chinese + ifnull(math, 0) as 语文数学总分 
from exam_result;
相关推荐
名字还没想好☜8 分钟前
Python concurrent.futures 实战:用 ThreadPoolExecutor 并发处理 + as_completed 收结果
数据库·python·php·并发
空杆推不起21 分钟前
穿透数据库 JOIN 核心:语法分类、底层算法、生产优化与高频坑点全解析
数据库·oracle
xxwl58530 分钟前
数据库后端接口测试报告
spring boot·mysql·tomcat
xqqxqxxq1 小时前
MySQL 数据类型笔记
数据库·笔记·mysql
Logintern091 小时前
理解MySQL数据库的“事务与锁”
数据库·mysql
朱容zr3331332 小时前
为什么推荐使用自增主键?使用UUID作为主键的优缺点是什么?
java·运维·数据库·后端·mysql·面试·性能优化
麻瓜code2 小时前
【Redis 】数据类型、持久化与过期删除
数据库·redis·缓存
空杆推不起2 小时前
穿透 Flink CDC 表层用法:数据库日志捕获机制、Flink Source 运行时、端到端一致性底层原理详解
大数据·数据库·flink
朱容zr3331332 小时前
请解释“回表”的概念。
java·前端·数据库
大黄说说3 小时前
EF Core 避坑指南:查询慢、循环查询、并发更新问题如何解决
java·服务器·数据库