刚接触MySQL那阵子,我最容易踩的坑就是把大量数据拉到应用层,再用Java、Python等语言做一轮又一轮的字符串截取、日期计算、条件判断。后来带团队做项目久了才发现,SQL里的函数才是处理数据最顺手的那层工具。想快速上手MySQL数据库基础,函数这关迟早要过,它能直接解决“数据格式不统一、统计维度太乱、报表逻辑冗长”这些日常问题,也适合所有刚学会建表、写select的新手,以及准备面试的开发者参考。
这篇文章我会按我自己的盘点习惯讲清楚:函数到底解决什么问题、常用分类怎么记、真实业务里怎么结合存储过程或行转列场景用,再把我实际遇到的环境报错和排查经验一起放出来。全程用命令行和SQL示例说话,尽量让没怎么写过函数的人也能直接抄作业。
1. 先别急着往表里堆函数,先明确它要解决的核心问题
1.1 为什么要在MySQL层直接用函数把数据算完
很多初学者在第一周会纠结:数据库里的数据明明原样取出,在代码里写个if、写个substring也一样能拿到结果,为什么非要学一堆MySQL函数?我的理解是:数据规模和程序结构决定了处理位置。
假设线上有十万条订单记录,你要把每条记录的订单号后四位取出来做分表归档。如果在应用层处理,你得先把十万条数据全量拉出来,再遍历、截取、拼接,不仅占内存,网络IO也会明显变慢。而MySQL自带的字符串函数,直接在SQL执行过程中把每一行转换好,返回的结果已经是你想要的格式。数据库本身是擅长批量运算的引擎,让数据在离源头最近的地方完成精简和计算,链路最短,也最容易保证统计口径一致。
再说一个容易被忽略的点:同一个统计逻辑如果写在应用层,不同项目组可能会写出不同的日期格式化方式,比如一个用yyyy-MM-dd,另一个用%Y-%m-%d,最后连报表口径都对不上。不如把这类公共转换直接沉淀成SQL函数或存储过程,让所有业务都走同一套“加工车间”。
1.2 函数的大类划分与执行时的基本规则
MySQL内置函数总体可以这么记:一类是按行处理的“单行函数”,比如处理某个字段的字符串、日期、数值;另一类是“聚合函数”,比如求和、计数、平均值,它会把多行结果收敛成一个汇总值。还有一类是流程控制,平时比较常用的包括IF、IFNULL、CASE WHEN。
理解这层分类后,再看SQL执行逻辑会顺很多。函数不是随便丢在任何地方都行。你可以把它放在SELECT后面对结果进行加工,也可以在WHERE里做条件过滤,还能用在GROUP BY、ORDER BY、HAVING中。但要注意:单行函数对WHERE条件中的列做加工时,往往会让索引失效,这一点后文会专门展开。
基本使用语法其实很简单,就是函数名(参数1, 参数2...)。比如:
sql复制SELECT NOW(), DATABASE(), USER();
这条SQL能同时看当前时间、当前数据库和当前登录用户。函数有返回类型,比如NOW()返回日期时间类型,LENGTH()返回整数,使用前最好能自己心里有个数,避免在套娃写法里算出来一个不预期的null值。
1.3 动手之前,先把可复现的测试表和初始环境拉起来
谈函数不能光靠背概念,我强烈建议你先建一个能反复折腾的测试表。以下是我平时创建示例表的做法:
sql复制CREATE DATABASE IF NOT EXISTS db_func_demo DEFAULT CHARACTER SET utf8mb4;
USE db_func_demo;
DROP TABLE IF EXISTS user_order;
CREATE TABLE user_order (
id INT PRIMARY KEY AUTO_INCREMENT,
order_no VARCHAR(32) NOT NULL,
user_name VARCHAR(50),
category VARCHAR(30),
amount DECIMAL(10,2),
pay_time DATETIME,
remark VARCHAR(255)
) ENGINE=InnoDB;
再塞点测试数据。不同MySQL版本安装完成后,有的机器默认就能连上,有的则需要先重置密码或设置环境变量,我先默认你已经能用命令行进入这个库。
sql复制INSERT INTO user_order(order_no, user_name, category, amount, pay_time, remark)
VALUES
('PO20240101001', '张三', '数码', 5999.00, '2024-01-03 12:20:15', ' 需要发票 '),
('PO20240102002', '李四', '图书', 129.00, '2024-01-10 09:05:11', '会员日订单'),
('PO20240215003', '王五', '数码', 299.00, '2024-02-15 22:33:40', NULL);
有了这些数据,下面每一个示例你都能直接运行对比结果。后面章节里出现的函数,几乎都是围绕这张订单表做的。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 最常用的5类MySQL函数,逻辑记忆和坑点一次讲透
2.1 字符串函数:乱格式数据的“整形师”
字符串函数是我平时使用频率最高的一类,因为任何业务系统都免不了处理订单号、备注、手机号、地址这类文本。最基础的有CONCAT、SUBSTRING和SUBSTRING_INDEX。
实际项目中我经常看到有人把SUBSTR、SUBSTRING和SUBSTRING_INDEX搞混,这很可以理解。SUBSTR(str, pos)和SUBSTRING(str, pos)效果基本一样,都是从指定位置开始取字符;区别不大。SUBSTRING_INDEX(str, delimiter, count)则是按照分隔符截取,它是处理“a-b-c”格式碎片的好帮手。例如从订单号中取第一个短横线前的部分:
sql复制SELECT order_no,
SUBSTRING(order_no, 1, 10) AS fixed_len_part,
SUBSTRING_INDEX(order_no, '-', 1) AS before_first_dash
FROM user_order
WHERE id = 1;
字符串去空格最常用的是TRIM、LTRIM、RTRIM,这类函数在Excel导入数据时特别管用。导入的数据经常带了不可见空字符,直接等值查询查不到,用TRIM包一层往往能解决。但要注意:它默认只去普通空格,如果字段里还有制表符或换行符,最好配合REPLACE一起处理。
大小写转换函数是UPPER和LOWER。还有一种
