查极值记录需用子查询、ORDER BY+LIMIT或窗口函数:子查询兼容性好但返回全部并列值;LIMIT/TOP高效但仅取一条;窗口函数最灵活,支持排名与扩展。

直接用 MIN() 和 MAX() 只能拿到极值本身(比如最小工资、最大年龄),拿不到整条记录。要查出“工资最低的员工是谁”或“最新一笔订单的完整信息”,得结合其他方法。
用子查询匹配极值对应行
这是最通用、兼容性最好的方式:先用 MIN() 或 MAX() 算出极值,再在 WHERE 中筛选字段等于该值的记录。
- 查工资最低的员工(假设表为
employees,字段为name,salary):
- 查最新一条订单(假设
orders表有order_id,order_date):
⚠️注意:如果存在多个相同极值(如两人同为最低工资),该方法会返回所有匹配记录。
用 ORDER BY + LIMIT / TOP 取首行(更高效,适合单条结果)
当只需要任意一条极值记录(例如“随便一个工资最低的人”),按目标字段排序后取第一行更简洁高效:
- MySQL / PostgreSQL:
- SQL Server:
✅优点:速度快,天然支持多字段排序(如先按工资升序,再按入职时间降序,确保稳定性);
❌缺点:若需返回全部并列极值记录,此法不适用。
用窗口函数(推荐用于复杂场景)
在支持窗口函数的数据库(PostgreSQL、SQL Server、Oracle、MySQL 8.0+)中,可精准标记并筛选极值行:
- 查所有工资最低的员工,并附带排名:
FROM employees
WHERE RANK() OVER (ORDER BY salary ASC) = 1;
RANK() 会为所有相同最小值分配相同排名(如都是第1名),ROW_NUMBER() 则强制唯一编号(适合只取一条)。这种方式逻辑清晰,也便于扩展(比如查“工资最低的前3人”只需改 = 1 为 )。
避免常见错误
- 别直接 SELECT * + GROUP BY + MIN()/MAX():这在标准 SQL 中非法,MySQL 旧版本虽允许但结果不可靠(非聚合字段值随机);
-
日期/字符串极值要注意类型和格式:比如
MAX('2023-10-05')没问题,但MAX('05/10/2023')可能按字符串比较出错; - NULL 值会被 MIN/MAX 忽略,除非整列全为 NULL(此时返回 NULL),无需额外处理,但需确认业务是否允许忽略。










