刚接触MySQL那会儿,我最怕看到一条SQL里塞满各种函数,感觉满屏都是括号,读起来像在做阅读理解。直到后来自己真正动手做报表,才发现函数不是用来炫技的,而是实打实帮你省时间的。同样一份订单量很大的数据库,不懂函数的人可能在程序里写循环一条条查,会MySQL常用函数的人在SQL里写几个聚合和格式化操作,几秒钟就把结果算完。这篇博文就是写给零基础读者的,围绕“常用函数”和“数据操作效率”这两个核心词,把平时用得最多的一批函数讲清楚:它们解决什么问题、语法长什么样、实际怎么用、有什么坑。你不用把MySQL官方文档背下来,先把这些高频函数吃透,日常开发和面试基本就够用了。
后面我会按函数类型拆开讲,每一部分都会配一个能直接跑起来的例子。为了方便演示,我们后面统一用一张订单表 orders,结构如下:
sql复制CREATE TABLE orders (
id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT NOT NULL,
order_no VARCHAR(64) NOT NULL,
amount DECIMAL(10, 2) NOT NULL,
status VARCHAR(20) NOT NULL,
pay_type VARCHAR(20),
created_at DATETIME NOT NULL
);
INSERT INTO orders (user_id, order_no, amount, status, pay_type, created_at) VALUES
(1, 'A001', 199.00, 'paid', 'alipay', '2025-01-05 10:23:00'),
(1, 'A002', 59.90, 'pending', 'wechat', '2025-01-12 14:30:00'),
(2, 'A003', 329.00, 'paid', 'card', '2025-02-03 09:15:00'),
(3, 'A004', 89.00, 'canceled', NULL, '2025-02-18 20:41:00'),
(2, 'A005', 499.00, 'paid', 'alipay', '2025-03-08 11:05:00'),
(3, 'A006', 129.00, 'pending', 'wechat', '2025-03-20 16:22:00');
后面的查询示例,你都可以拿这张表自己跑一遍。
1. 学函数之前,先把这两件事搞清楚
1.1 函数在SQL语句里到底起什么作用
很多人会把“函数”想象得很高深,其实你可以把MySQL函数理解成一个“加工车间”:你给进去一个或者几个值,它按照预先设定好的规则处理一下,再给你吐出一个结果。比如 NOW() 不给参数也能用,返回当前系统时间;ROUND(3.14159, 2) 给进去一个小数,它帮你处理成保留两位小数的结果“3.14”。函数不神秘,它就是帮你把重复性、容易出错的计算逻辑封装起来,让你少写代码。
在实际应用里,函数主要有两个使用位置。一个是在 SELECT 后面,对查询出来的字段做加工,比如把订单创建时间格式化成年月日的样子,或者把手机号中间四位用星号遮挡;另一个是在 WHERE 后面,把字段值做判断和过滤,比如筛选出创建时间在某个范围内的订单。你甚至可以把它嵌套在 INSERT、UPDATE、DELETE 语句里,比如更新时间字段直接写成 updated_at = NOW()。不管放在哪里,本质都一样:让数据库帮我们把数据处理完,而不是把原始数据捞到程序里再慢慢手工处理。
这也解释了一个常被忽视的问题:为什么函数能“提升数据操作效率”?因为SQL语句里写好函数之后,一条查询就能直接返回最终结果,不需要程序端反复请求数据库,也不需要把大量原始数据拉到内存里自己轮询。我见过不少新人查一个“每个月销售额汇总”,程序里写循环,每月跑一条SQL,总共12次请求。换成 GROUP BY 配合日期函数,一条SQL全搞定,这就是效率提升最直观的体现。
1.2 MySQL函数的基本分类
MySQL的函数很多,官方文档能列出几百个,但你根本不需要全记。从零基础日常使用和面试频率来看,按功能可以划分成几大类:聚合函数(COUNT、SUM、AVG、MAX、MIN)、字符串函数(CONCAT、SUBSTRING、REPLACE、LENGTH)、日期时间函数(NOW、DATE_FORMAT、DATE_ADD、DATEDIFF)、逻辑控制函数(IF、IFNULL、CASE WHEN)、数值函数(ROUND、CEIL、FLOOR)。这五类基本覆盖了写业务SQL的90%场景。
学习建议上,我不建议你拿着官方函数列表从头到尾背一遍。你先掌握下面一句话的框架:聚合函数是用来做统计的,字符串函数是用来处理文本的,日期时间函数是处理时间字段的,逻辑控制函数是让SQL能“根据条件走不同分支”的,数值函数是做数字计算的。后面每一章的示例都围绕这张订单表展开,你会慢慢发现它们不是孤立的,经常是“日期函数 + 聚合函数”“逻辑函数 + 聚合函数”混在一起用,那才是真正工作里的常态。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 聚合函数:统计报表里的顶梁柱
2.1 五个聚合函数先记熟
我教新人最省力的办法是,先把聚合函数这五个背下来:COUNT(统计数量)、SUM(求和)、AVG(求平均)、MAX(求最大值)、MIN(求最小值)。它们的特点都是“对多行数据进行计算,最后返回一个值”。比如我们想知道订单表里总共有多少条订单、已支付订单金额合计多少、最大单笔金额多少、平均金额多少,一条SQL就能算完:
sql复制SELECT
COUNT(*) AS order_count,
SUM(amount) AS total_amount,
AVG(amount) AS avg_amount,
MAX(amount) AS max_amount,
MIN(amount) AS min_amount
FROM orders;
执行结果里会出现一行,六个数字分别回答了六个问题。这里面有一个初学者最容易忽略的点:AVG(amount) 只对非NULL的金额求平均,SUM 也只加非NULL值。如果某一行的 amount 是 NULL,它不会被计入,也不会报错。这一点在真实生产环境很重要,因为NULL并不是0,它代表“没有值”。
另外值得说一句,SELECT 后同时出现普通字段和聚合函数时会有一个经典报错,比如下面这句在很多老版本里能跑,但新版本MySQL会直接报错:
sql复制-- 注意:这样写在新版MySQL里可能报 ONLY_FULL_GROUP_BY 相关错误
SELECT user_id, COUNT(*) FROM orders;
原因很简单:user_id 可能有多个不同的值,你要数据库显示哪一行?MySQL没法替你决定,所以要求你必须用 GROUP BY user_id 明确分组规则。这个问题几乎每个零基础学习者在聚合函数阶段都会遇到,不是SQL写错了,是逻辑上确实不自洽。
2.2 COUNT 里的三个细节
COUNT 有好几种写法:COUNT(*)、COUNT(1)、COUNT(字段名)、COUNT(DISTINCT 字段名)。有人说它们性能差别天壤之别,实际上在InnoDB引擎下,COUNT(*) 和 COUNT(1) 差别非常小,你不需要过分纠结,按习惯用 COUNT(*) 就行,它统计的是“表的行数”。真正要留意的区别在第四种写法上。
COUNT(字段名) 只统计该字段非NULL的行数。举个例子,订单表里 pay_type 字段有一行是 NULL,如果你执行 SELECT COUNT(pay_type) FROM orders,结果会是 5,而不是总行数 6。这个细节做统计时经常出问题。再说 COUNT(DISTINCT user_id),它统计“有多少个不同的用户下了单”,比如表里 user_id 有1、2、3三个,结果就是3。如果你想看“哪些天有成交订单”,也可以写 COUNT(DISTINCT DATE(created_at)),先把时间转成日期再去重计数。
这里还有一个面试中特别爱问的坑,放进第5章“逻辑控制函数”部分讲会更顺,因为牵涉到 IF 的返回值写 1 还是写 NULL 会
