📄 一句话概括
MAX / MIN 在一列里挑最大、最小值——聚合函数第二发;【最高分】一个数就回来,不用拉全表排队。
📝 本节和前面几节的关系
3-15 学了数数;本节挑极值。它和 3-13 的 ORDER BY 是【同一个问题的两种问法】——【最高分是谁】既可以让函数给数、也可以让排序给行,适用场景不同。
一、两条命令
-- 准备块(没建表先跑 3-6 的准备块)
SELECT MAX(score) FROM students; -- 92
SELECT MIN(score) FROM students; -- 64(钱七 NULL 不参与)
- 括号里放列名,DBMS 扫整列取极值——返回一个数,不返回行
- NULL 自动出局:MAX/MIN 根本不看空值
二、MAX/MIN vs ORDER BY:两个问法
【最高分是多少】和【谁考了最高分】是两个问题:
-- 问法一:只问分数(聚合,快,一个数)
SELECT MAX(score) AS 最高分 FROM students;
-- 问法二:问人(排序取头,返回行)
SELECT name, score FROM students ORDER BY score DESC LIMIT 1;
| MAX | ORDER BY + LIMIT | |
|---|---|---|
| 返回 | 一个数 | 一行(能带姓名等其它列) |
| 适用 | 只关心数值 | 要知道【是谁】 |
注意坑:想用 SELECT name, MAX(score) FROM students; 一句同时拿【人和分】——多数 DBMS 会跑但行为不可靠(name 可能不是最高分那行的)!【是谁】的老实用法是问法二。
三、动手 Demo:极值四连
-- ① 全班最高分
SELECT MAX(score) AS 最高分 FROM students; -- 92
-- ② 最低分
SELECT MIN(score) AS 最低分 FROM students; -- 64
-- ③ 1 班的最高分(聚合+WHERE 组合)
SELECT MAX(score) AS 一班最高 FROM students WHERE class = 1; -- 92
-- ④ 最高分的人是谁(排序问法)
SELECT name, score FROM students ORDER BY score DESC LIMIT 1; -- 李四 92
-- ⑤ 文本列也能取极值(字典序)
SELECT MAX(name) AS 末位姓名 FROM students; -- 按拼音序最后一个:赵六
看到什么算成功:①92/②64/③92/④李四——能说出【③为什么也是 92:先筛 1 班再挑】。
四、30 秒实验
对空结果集取极值:SELECT MAX(score) FROM students WHERE class = 99;——没有行可比,返回 NULL(不是 0、不报错)。对照 3-15:COUNT 对空集给 0,MAX/MIN 对空集给 NULL——各函数对空集的态度不同,别想当然。
五、常见误区
- "MAX 会返回最高分那一整行" —— 只返回一个数。【是谁】用 ORDER BY + LIMIT 1。
- "name 和 MAX(score) 写一句就能拿到最高分的人" —— 危险!各列的取值可能来自不同行,行为不可靠(标准 SQL 直接禁)。
- "MIN 对 NULL 会给 0" —— NULL 直接不参与;全列都空时 MIN 返回 NULL。
自测三问(点开对答案)
1. 【最高分是多少】和【谁考最高分】分别用什么写法? **MAX(score)/ORDER BY score DESC LIMIT 1**。 2. `SELECT name, MAX(score) FROM students;` 为什么危险? **name 与 MAX 的取值可能来自不同行**,结果不可靠。 3. 空结果集上 MAX 返回什么? **NULL**(COUNT 对空集是 0——态度不同)。- ☐ 下一节(3-17 SUM函数、AVG函数-获取记录的合计值和平均值)
相关笔记
- COUNT函数-获取记录的数量 —— 上一节:聚合函数第一发
- 🗄️ 数据库基础 · 索引 —— 全课路线图