在SQL的实际使用中,查找最大值、最小值是非常常见的需求,很多开发者会搞不清GREATEST、LEAST函数和MAX函数的区别,导致在编写查询语句时出现逻辑错误。这三者的核心差异主要体现在适用场景、参数形式和计算逻辑上,下面会逐一展开说明。

MAX函数的基本用法
MAX是SQL中的聚合函数,主要用于计算某一列的最大值,通常和GROUP BY子句配合使用,用来统计分组后的最大值。它的参数是一个列名,不能直接传入多个独立的参数值。
比如我们有一张用户消费记录表user_order,结构如下:
| 字段名 | 类型 | 说明 |
|---|---|---|
| user_id | int | 用户ID |
| order_amount | decimal | 订单金额 |
| order_date | date | 下单日期 |
如果要查询所有订单中的最大金额,可以使用以下SQL:
-- 查询全表最大订单金额 SELECT MAX(order_amount) AS max_amount FROM user_order;
如果要查询每个用户的最大订单金额,需要结合GROUP BY:
-- 查询每个用户的最大订单金额 SELECT user_id, MAX(order_amount) AS user_max_amount FROM user_order GROUP BY user_id;
GREATEST和LEAST函数的基本用法
GREATEST和LEAST是SQL中的标量函数,用于从多个独立的参数值中找出最大值和最小值,参数可以是具体的数值、字段名或者表达式,支持传入多个参数,参数数量没有固定限制。
比如要比较三个字段的大小,找出最大的那个值,就可以使用GREATEST函数。假设我们有一张学生成绩表student_score,包含语文、数学、英语三个科目的成绩:
-- 查询每个学生的最高科目成绩
SELECT
student_id,
GREATEST(chinese_score, math_score, english_score) AS highest_score,
LEAST(chinese_score, math_score, english_score) AS lowest_score
FROM student_score;
这两个函数也可以直接传入常量参数:
-- 直接比较多个常量值 SELECT GREATEST(10, 25, 3, 18) AS max_val, LEAST(10, 25, 3, 18) AS min_val;
三者的核心区别对比
为了更清晰地展示三者的差异,我们从多个维度进行对比:
| 对比维度 | MAX函数 | GREATEST函数 | LEAST函数 |
|---|---|---|---|
| 函数类型 | 聚合函数 | 标量函数 | 标量函数 |
| 参数要求 | 只能传入一个列名 | 可传入多个参数,参数可以是字段、常量、表达式 | 可传入多个参数,参数可以是字段、常量、表达式 |
| 适用场景 | 统计某一列的最大值,通常配合GROUP BY使用 | 从多个独立参数中找最大值 | 从多个独立参数中找最小值 |
| 空值处理 | 忽略空值,只计算非空值的最大值 | 如果任意一个参数为空,返回结果为空 | 如果任意一个参数为空,返回结果为空 |
空值处理的注意事项
三者在处理空值的时候逻辑差异很大,实际使用中需要特别注意。比如下面的示例:
-- 创建测试表
CREATE TABLE test_null (
id int,
val1 int,
val2 int,
val3 int
);
-- 插入测试数据,包含空值
INSERT INTO test_null VALUES (1, 10, NULL, 30);
INSERT INTO test_null VALUES (2, 20, 40, 50);
-- MAX函数忽略空值
SELECT id, MAX(val1) AS max_val1, MAX(val2) AS max_val2 FROM test_null GROUP BY id;
-- GREATEST函数遇到空值返回空
SELECT id, GREATEST(val1, val2, val3) AS greatest_val FROM test_null;
-- LEAST函数遇到空值返回空
SELECT id, LEAST(val1, val2, val3) AS least_val FROM test_null;
如果需要在GREATEST函数中处理空值,可以结合COALESCE函数给空值设置默认值:
-- 给空值设置默认值0后再比较 SELECT id, GREATEST(COALESCE(val1,0), COALESCE(val2,0), COALESCE(val3,0)) AS greatest_val FROM test_null;
实际使用场景选择
根据需求的不同,选择合适的函数可以简化SQL逻辑:
- 如果是要统计某张表中某一列的最大值,或者分组统计每组的最大值,优先选择MAX函数。
- 如果是要比较同一行中多个字段的大小,找出最大或者最小的值,优先选择GREATEST或者LEAST函数。
- 如果是要比较多个常量值的大小,也只能使用GREATEST或者LEAST函数,MAX函数不支持这种场景。
需要注意的是,GREATEST和LEAST函数并不是所有SQL数据库都支持,部分数据库可能有自己的替代函数,比如MySQL支持这两个函数,而SQL Server中没有这两个函数,需要使用CASE WHEN表达式来实现相同的逻辑。
-- SQL Server中实现GREATEST逻辑的替代写法
SELECT
id,
CASE
WHEN val1 >= val2 AND val1 >= val3 THEN val1
WHEN val2 >= val1 AND val2 >= val3 THEN val2
ELSE val3
END AS greatest_val
FROM test_null;
SQLGREATEST函数LEAST函数MAX函数修改时间:2026-07-05 02:30:25