07-MySQL内置函数
💬 :如果你在阅读过程中有任何疑问或想要进一步探讨的内容,欢迎在评论区畅所欲言!我们一起学习、共同成长~!
👍 :如果你觉得这篇文章还不错,不妨顺手点个赞、加入收藏,并分享给更多的朋友噢~!
1. 日期函数(笔试高频:时间筛选/计算)
1.1 常用日期函数
| 函数名称 | 核心描述 |
|---|---|
| current_date() | 返回当前日期(格式:YYYY-MM-DD) |
| current_time() | 返回当前时间(格式:HH:MM:SS) |
| current_timestamp() | 返回当前时间戳(格式:YYYY-MM-DD HH:MM:SS) |
| now() | 返回当前日期时间(与 current_timestamp () 等效,笔试更常用 now ()) |
| date(datetime) | 提取 datetime 参数的 “日期部分”(去除时间) |
| date_add ('date', interval 值 单位) | 给日期 / 时间加指定值(单位:year/minute/second/day,笔试常考 day/minute) |
| date_sub ('date', interval 值 单位) | 给日期 / 时间减指定值(单位同 date_add) |
| datediff('date1', 'date2') | 计算两个日期的差值(单位:天),结果 = date1 - date2 |
1.1.1 必掌握案例代码
(1)基础时间获取
- 依次获取当前日期、当前时间、当前时间戳

(2)日期增减操作
- 计算10天后的日期

-
计算2天前的日期

(3)日期差计算

-- 1. 计算两个日期相差的天数(比如:用户注册到现在的天数)
select datediff('2017-10-10', '2016-09-01');
-- 结果:404(2017-10-10 减 2016-09-01 的天数)-- 2. 业务场景:查询“2分钟内发布的留言”(笔试高频题)
-- 思路:给留言时间加2分钟,若仍大于当前时间,说明在2分钟内
create table msg (id int primary key auto_increment,content varchar(30) not null,sendtime datetime -- 留言发布时间
);
-- 插入测试数据
insert into msg(content, sendtime) values('hello1', now()), ('hello2', now());
-- 核心查询:2分钟内的留言
select * from msg where date_add(sendtime, interval 2 minute) > now();
(4)业务场景:查询“2分钟内发布的留言”
create table msg(id int primary key auto_increment,content varchar(30) not null,sendtime datetime);insert into msg(content,sendtime) values('hello',now()),('baby',now());select * from msg;select * from msg where date_add(sendtime,interval 2 minute)>now();
-- 给每条留言的sendtime加2分钟,若结果 > 当前时间,说明发布时间 < 2分钟
2. 字符串函数(面试重点:数据格式化 / 处理)
2.1 常用字符串函数
| 函数名称 | 核心描述 |
|---|---|
| concat(str1, str2, ...) | 连接多个字符串(笔试高频:格式化输出,如 “XXX 的分数是 XXX”) |
| length(str) | 计算字符串长度(单位:字节,注意:中文占多字节,与字符集相关) |
| replace (str, 旧字符,新字符) | 替换字符串中的指定字符 |
| substring (str, 起始位置,长度) | 截取字符串(起始位置从 1 开始,笔试常考 “截取第 N 到第 M 个字符”) |
| lcase(str)/ucase(str) | 转换字符串为小写 / 大写 |
| trim(str)/ltrim(str)/rtrim(str) | 去除字符串两端空格 / 左空格 / 右空格(数据清洗常用) |
| instr (str, 子串) | 查找子串在字符串中的位置(无则返回 0,类似 C++ 的 find ()) |
2.1.1 必掌握案例代码

(1)字符串连接与格式化(高频:业务数据展示)
场景:展示学生分数,格式为“XXX语文XXX分,数学XXX分”

(2)求字符串长度(字符集与字节认知)
(面试常考 “中文长度计算”)
计算表中 name 与 info 字段的字节长度:
utf8 / utf8mb4 编码下的字节规则:
- 中文——1个字符占3个字节;
- 英文/数字/符号——1个字符占1个字节。

(3)字符替代(数据清洗)
将表中 info 字段的 Stu 替换为 Student :

(4)字符串截取
- substring() 起始位置从1开始。
截取 info 字段第1~第12个字符,以及第5位起的10个字符:

(5)大小写转换

3. 数学函数(基础考点:数值计算)
3.1 常用数学函数
| 函数名称 | 核心描述 |
|---|---|
| abs (数值) | 计算绝对值 |
| ceiling (数值) | 向上取整(如 ceiling (23.04) → 24,ceiling (23.9) → 24) |
| floor (数值) | 向下取整(如 floor (23.7) → 23,floor (23.1) → 23) |
| format (数值,小数位数) | 格式化数值(保留指定小数位,四舍五入,如 format (12.3456, 2) → 12.35) |
| rand() | 生成随机浮点数(范围 [0.0, 1.0),笔试常考 “生成随机数”) |
| mod (数值,除数) | 取模(求余,如 mod (10, 3) → 1,与 C++ 的 % 运算符一致) |
3.1.1 必掌握案例代码
-- 1. 绝对值
select abs(-100.2); -- 结果:100.2-- 2. 取整
select ceiling(23.04); -- 结果:24(向上取整)
select floor(23.7); -- 结果:23(向下取整)-- 3. 数值格式化(保留2位小数,四舍五入)
select format(12.3456, 2); -- 结果:12.35-- 4. 生成随机数(如:生成1-100的随机整数)
select floor(rand() * 100 + 1);
-- 思路:rand()→[0,1) → ×100→[0,100) → +1→[1,101) → 向下取整→1-100
4. 其它实用函数
4.1 常用工具函数
| 函数名称 | 核心描述 |
|---|---|
| user() | 查询当前登录 MySQL 的用户(如:root@localhost) |
| database() | 查询当前正在使用的数据库(避免 “use 数据库” 后遗忘的场景) |
| md5(str) |
|
| ifnull(val1, val2) | 处理 null 值:若 val1 为 null 则返回 val2,否则返回 val1(避免 null 影响计算) |
4.1.1 必掌握案例代码
(1)查询当前用户与数据库
select user(); -- 结果示例:root@localhost
select database(); -- 结果示例:test3(当前使用的数据库)
(2)md5 加密
select md5('admin'); -- 结果:21232f297a57a5a743894a0e4a801fc3(固定32位)
场景 1:创建用户表,存储 MD5 加密后的密码
create table user(username varchar(20) primary key, password varchar(32) not null
);-- 密码'123456'先加密再存储
insert into user values('zhangsan', md5('123456'));
场景 2:用户登录时,验证密码
-- 假设用户输入:用户名'zhangsan',密码'123456'
-- 验证逻辑:将输入的密码md5加密后,与表中password字段对比
select * from user
where username = 'zhangsan' and password = md5('123456');
-- 若查询出结果,说明密码正确;无结果则密码错误
(3)处理null值
select ifnull('abc', '123'); -- val1='abc'非null,返回'abc'
select ifnull(null, '123'); -- val1=null,返回'123'
-- 场景:计算学生平均分,若某科分数为null,按0计算
select name, (chinese + ifnull(math, 0))/2 as 平均分 from student;
5. 实战 OJ 题(笔试场景:字符串统计)
查找字符串 '10,A,B' 中逗号出现的次数是笔试常见小题,需掌握“替换 + 长度差”的核心思路,可直接套用在类似题目(如 “统计空格次数”“统计指定字符次数”)中。
5.1 解题思路
核心原理:逗号次数 = 原字符串长度 - 去掉所有逗号后的字符串长度
步骤拆解:
第一步:计算原字符串的长度(length ());
第二步:将原字符串中的所有逗号替换为空(replace (str, ',', ''));
第三步:计算替换后字符串的长度(length ());
第四步:用原长度减替换后长度,得到逗号次数。
5.2 代码实现


