🗄️ 第三章 操作数据库-SQL的使用方法
📄 一句话概括

MAX / MIN 在一列里挑最大、最小值——聚合函数第二发;【最高分】一个数就回来,不用拉全表排队。

📝 本节和前面几节的关系

3-15 学了数数;本节挑极值。它和 3-13 的 ORDER BY 是【同一个问题的两种问法】——【最高分是谁】既可以让函数给数、也可以让排序给行,适用场景不同。

一、两条命令

-- 准备块(没建表先跑 3-6 的准备块)

SELECT MAX(score) FROM students;    -- 92
SELECT MIN(score) FROM students;    -- 64(钱七 NULL 不参与)

二、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——各函数对空集的态度不同,别想当然。

五、常见误区

  1. "MAX 会返回最高分那一整行" —— 只返回一个数。【是谁】用 ORDER BY + LIMIT 1。
  2. "name 和 MAX(score) 写一句就能拿到最高分的人" —— 危险!各列的取值可能来自不同行,行为不可靠(标准 SQL 直接禁)。
  3. "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——态度不同)。

相关笔记