max()/min() 返回null因无有效输入;字符串按字典序比较;查最值应单语句select max(), min();group by时聚合作用于分组内;找整行需窗口函数或自连接。

直接用 MAX() 和 MIN() 就能拿到,但结果为空、类型不对、NULL 被忽略或误用 GROUP BY 是最常踩的坑。
为什么 MAX() 返回 NULL 而不是数字?
这通常是因为整列都是 NULL,或者 WHERE 条件没匹配到任何行。SQL 标准规定:聚合函数在无有效输入时返回 NULL,而不是报错。
- 检查是否有数据:
SELECT COUNT(*) FROM table_name WHERE column_name IS NOT NULL; - 确认条件是否太严:
WHERE status = 'active'可能筛掉了全部记录 - 如果想避免 NULL,可用
COALESCE(MAX(col), 0)(注意:0 类型需和列一致,比如日期列不能填 0)
字符串列用 MIN() / MAX() 是按字典序比较
对 TEXT 或 VARCHAR 列执行 MAX(name),返回的是字典序最大(如 “Zebra” > “apple”),不是长度最长或最常用那个。
- 要找最长字符串:
ORDER BY LENGTH(name) DESC LIMIT 1 - 要忽略大小写排序:
ORDER BY LOWER(name) DESC LIMIT 1(MIN()/MAX()默认区分大小写,具体行为取决于 collation) - 中文场景下,collation 设置(如
utf8mb4_unicode_ci)会影响排序结果,别假设它一定按拼音排
同时查最大值和最小值,别写两条 SELECT
用一条语句查两个值最高效,也避免两次扫描表:
SELECT MAX(price) AS max_price, MIN(price) AS min_price FROM products;
- 如果加了
WHERE,确保条件一致,否则两列可能来自不同子集 - 在大表上,有
price索引的话,MIN/MAX可走索引最左前缀,速度接近 O(1) - 不要写成
(SELECT MAX(price)) AS max, (SELECT MIN(price)) AS min—— 多余子查询,MySQL 会重复执行
带 GROUP BY 时,MIN() 和 MAX() 的作用范围容易误解
它们只对每个分组内部计算,不是全表;一旦写了 GROUP BY,所有非聚合字段都必须出现在 GROUP BY 列表里,否则报错(严格模式下)。
- 错误写法:
SELECT category, MAX(price), name FROM products GROUP BY category→name不在 GROUP BY 中,也不在聚合函数里 - 正确做法:要么去掉
name,要么用MAX(name)(但意义可能是字典最大名,未必是对应最高价的商品) - 若想查“每个分类中价格最高的那条完整记录”,
MIN()/MAX()不够用,得配合窗口函数或自连接
真正麻烦的不是语法,而是你默认它“按直觉工作”——比如以为 MAX(date) 一定能拿到最新一条记录,却忘了时区、格式不统一或字段其实是字符串类型。










