MySQL的MAX()和MIN()是常用的聚合函数,分别用于返回指定列的最大值和最小值,在数据统计、极值查询等场景中应用十分广泛。这两个函数的使用逻辑并不复杂,但在实际开发中如果不注意细节,很容易出现查询结果不符合预期的情况。

MAX()和MIN()函数的基础语法
两个函数的基础语法结构一致,基本格式如下:
-- MAX函数语法,返回column_name列的最大值 MAX(column_name) -- MIN函数语法,返回column_name列的最小值 MIN(column_name)
函数可以作用于数值型、字符串型、日期时间型的字段:数值型字段会按数值大小比较,字符串型字段按字符集的排序规则比较,日期时间型字段按时间先后比较,时间更晚的日期对应MAX值,更早的对应MIN值。
NULL值的处理规则
MAX()和MIN()函数在计算时会自动忽略列中的NULL值,不会将NULL纳入极值计算范围。如果指定列的所有值都是NULL,那么函数会返回NULL结果。
我们可以通过以下示例验证这个规则,先创建测试表并插入数据:
-- 创建测试表
CREATE TABLE test_score (
id INT PRIMARY KEY AUTO_INCREMENT,
score INT,
student_name VARCHAR(20)
);
-- 插入测试数据,包含NULL值
INSERT INTO test_score (score, student_name) VALUES
(85, '张三'),
(92, '李四'),
(NULL, '王五'),
(78, '赵六');
查询score列的极值:
-- 查询最高分,结果为92 SELECT MAX(score) AS max_score FROM test_score; -- 查询最低分,结果为78 SELECT MIN(score) AS min_score FROM test_score;
可以看到NULL值的记录没有被纳入计算,最高分是92,最低分是78。
常见使用场景
单字段极值查询
这是最基础的使用场景,直接查询单个字段的极值,比如查询商品表的最高价格和最低价格:
-- 假设商品表为product,price为价格字段 SELECT MAX(price) AS max_price, MIN(price) AS min_price FROM product;
分组场景下的极值查询
如果需要按某个维度分组后获取每组的极值,需要搭配GROUP BY子句使用。比如查询每个班级的最高分和最低分:
-- 假设score表包含class_id(班级ID)和score(分数)字段
SELECT
class_id,
MAX(score) AS class_max_score,
MIN(score) AS class_min_score
FROM score
GROUP BY class_id;
搭配条件过滤使用
可以在WHERE子句中添加过滤条件,先筛选符合条件的记录再计算极值。比如查询成绩大于80分的学生的最高分和最低分:
SELECT MAX(score) AS max_score, MIN(score) AS min_score FROM test_score WHERE score > 80;
常见使用误区与规避方法
误区1:同时查询极值和对应记录的其他字段
很多用户会尝试直接同时查询极值和对应的学生姓名等字段,比如以下错误写法:
-- 错误写法,MySQL中这样的查询逻辑不严谨,返回的学生姓名可能和极值不匹配 SELECT MAX(score) AS max_score, student_name FROM test_score;
规避方法:如果需要获取极值对应的完整记录,应该使用子查询,先获取极值再匹配对应的记录:
-- 查询最高分对应的学生信息 SELECT * FROM test_score WHERE score = (SELECT MAX(score) FROM test_score);
误区2:对COUNT()和MAX()/MIN()的使用场景混淆
COUNT()用于统计行数,MAX()/MIN()用于获取极值,不要误用函数。比如需要统计非空值的行数用COUNT(score),需要获取最大分数用MAX(score),两者功能完全不同。
误区3:忽略字段类型对比较结果的影响
如果字段是字符串类型的数值,比如score字段是VARCHAR类型,存储的值是'78'、'92'、'100',那么MAX()函数会按字符串规则比较,'92'会大于'100',因为字符串比较是逐字符比较,'9'的ASCII码大于'1'。这种情况下需要先转换字段类型为数值型再计算:
-- 将字符串类型字段转为数值型后计算极值 SELECT MAX(CAST(score AS SIGNED)) AS max_score FROM test_score;
总结
MAX()和MIN()函数是MySQL中获取数值极值的便捷工具,使用时需要注意它们会自动忽略NULL值,分组查询要搭配GROUP BY子句,不要直接在查询极值的同时返回非聚合字段的内容。只要掌握这些使用规则和常见误区的规避方法,就能准确高效地完成各类极值查询需求。