当前位置: 首页 > news >正文

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;
http://www.dtcms.com/a/503217.html

相关文章:

  • FastAPI(一)——路径操作
  • 达梦数据库备份与恢复:dexp 和 dimp 工具的使用与优化
  • 众划算网站开发网站建设与管理教案怎么写
  • Agent 开发设计模式(Agentic Design Patterns )第 7 章:多智能体协作(Multi-Agent Collaboration)
  • LangGraph React智能体 - 推理与行动的完美结合
  • `tanslate=“no“`避免使用 HTML 中的翻译属性自动翻译品牌名称等
  • 深圳led网站建设最好的手表网站
  • Oracle 常见的33个等待事件
  • 比特位计数(二)
  • Linux网络HTTP(中)(8)
  • wordpress老站开启多站点wordpress评论是关闭还是开启
  • 建设宣传网站上的请示邯郸网站建设哪能做
  • Linux 例行性工作任务(定时任务)知识点总结
  • 一文学会大模型开发Eino框架的模型调用方法
  • Docker命令大全:从入门到精通
  • 沈阳网站制作公司思路留学网站建设
  • js封装一个双精度算法实现
  • 性能优化:提升软件效率的实用指南
  • 【FPGA】设计流程——Veriolg输入
  • 公共交通安全再讨论
  • C++蓝桥杯之结构体10.15
  • 从原理到实战:Java 队列(Queue)指南
  • 【C++】用红黑树封装map与set
  • php网络公司网站源码网站建设与管理的体会
  • 做网站要先申请域名吗做彩铃的网站
  • 零基础做地方门户网站装修网名大全
  • Docker入门手册
  • 谷歌 Gemini 2.5 Flash Image 震撼升级图像编辑
  • Spring Boot 3零基础教程,WEB 开发 整合 Thymeleaf 笔记36
  • [go 面试] 并发与数据一致性:事务的保障