0Pricing
Coding Interview Prep · 课时

MIN、MAX 与非数值汇总

汇总日期和字符串,并理解文本上的 MIN 含义

MIN、MAX 与非数值汇总 是 CoddyKit 上的免费 Coding Interview Prep 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Coding Interview Prep 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Coding Interview Prep 课程共包含 4 节课。

超越数字的 MIN 和 MAX

候选人往往以为 MIN 和 MAX 只能处理数字。面试官很喜欢问:“MAX(name) 会返回什么?MIN(order_date) 呢?”

事实是:MIN 和 MAX 适用于任何可排序类型 — 数字、日期和字符串都可以。真正需要掌握的是每种类型的排序规则。

数值类型的情况

先从熟悉的情况开始。对于数值列,MIN 返回最小值,MAX 返回最大值。就是这么简单。

和其他聚合函数一样,MIN 和 MAX 会忽略 NULL。NULL 永远不会成为最小值或最大值,而是会被直接跳过。如果所有值都为 NULL,两者都会返回 NULL。

SELECT MIN(salary) AS lowest, MAX(salary) AS highest
FROM employees;

日期上的 MIN 和 MAX

日期和时间戳完全可以进行排序,因此 MIN(order_date) 会给出最早的日期,而 MAX(order_date) 会给出最晚的日期。

无需排序和限制结果,就可以用这种方式回答“第一笔订单是什么时候下的?”(MIN)以及“最近一次活动是什么时候?”(MAX)。这是惯用的基于集合的解决方案。

SELECT
  MIN(order_date) AS first_order,
  MAX(order_date) AS latest_order
FROM orders;

一次查询计算日期跨度

一个常见的后续问题是:“这位客户已经活跃了多久?”将 MIN 和 MAX 结合起来,再进行相减。

这样可以计算第一笔订单与最后一笔订单之间的跨度。具体的相减语法因 SQL 方言而异,但 MIN/MAX 的思路具有普适性,也说明您可以用声明式方式表达范围。

SELECT
  customer_id,
  MIN(order_date) AS first_order,
  MAX(order_date) AS last_order,
  MAX(order_date) - MIN(order_date) AS active_days
FROM orders
GROUP BY customer_id;

字符串上的 MIN 和 MAX

这里是最容易让人感到意外的地方。对于文本列,MIN 和 MAX 会根据列的排序规则,使用字典序(字母顺序)进行排序。

因此,MIN(name) 会返回按字母顺序排在最前面的名称,而 MAX(name) 会返回排在最后面的名称。对 {'Carol', 'Alice', 'Bob'} 使用 MIN 会返回 'Alice';使用 MAX 会返回 'Carol'。

SELECT MIN(name) AS first_alpha, MAX(name) AS last_alpha
FROM employees;
-- with Alice, Bob, Carol: 'Alice' and 'Carol'

排序规则与大小写敏感性

字符串排序取决于排序规则,排序规则会控制大小写敏感性和区域规则。在许多默认排序规则下,大写字母可能排在小写字母之前,因此对 {'apple', 'Banana'} 使用 MAX 的结果可能会让您感到意外。

在面试中,请提到字符串 MIN/MAX 的结果取决于排序规则。这一细节能区分死记硬背的回答和真正的理解。

MIN 作用于文本时不表示什么

一个常见的误解是:MIN(name) 会返回最短的字符串,或者 MAX(name) 会返回最长的字符串。事实并非如此。它完全取决于排序顺序,而不是长度。

如果您确实需要最长的字符串,可以按 LENGTH(name) 排序并选取第一行,或者使用 MAX(LENGTH(name)),只获取长度。不要把值的排序与长度混为一谈。

SELECT MAX(LENGTH(name)) AS longest_name_length
FROM employees;

MIN/MAX 不会组合列

一个重要的陷阱是:MIN 和 MAX 会独立地作用于单个列。它们不会返回包含最小值或最大值的整行。

如果您在没有分组的情况下写出 SELECT MIN(salary), name,您不会得到最低收入者的姓名——根据 SQL 方言的不同,您可能得到一个错误,或者得到一个任意的姓名。要获取完整的行,请使用 ORDER BY + LIMIT 或窗口函数。

-- Wrong assumption: this does NOT give the lowest earner's name.
-- Correct approach to get the whole row:
SELECT name, salary
FROM employees
ORDER BY salary ASC
LIMIT 1;

MIN/MAX 的 NULL 行为回顾

与 SUM 和 AVG 一样,MIN 和 MAX 会忽略 NULL。NULL 既不是最小值,也不是最大值。

  • 混合值和 NULL:忽略 NULL,返回实际的最小值或最大值。
  • 所有值都是 NULL 或没有行:MIN 和 MAX 返回 NULL。

可以清楚地指出,所有聚合函数都具有这一一致性:“所有标准聚合函数都会忽略 NULL。”

在分组中使用

MIN 和 MAX 与 GROUP BY 搭配使用时,可以很好地求出每个组的极值。“每个部门的最高工资”就是一个经典例子。

这会为每个部门返回一行,其中包含该部门的最高工资。请记住:它返回的是值,而不是员工。将姓名与该值对应起来,是另一个(而且很常见的)后续问题。

SELECT department, MAX(salary) AS top_salary
FROM employees
GROUP BY department;

如何自信地回答

一个有力的面试回答是:“MIN 和 MAX 适用于任何可排序类型。对于数字,它们表示最小值和最大值;对于日期,它们表示最早和最晚;对于字符串,它们按照列的排序规则进行字母排序。它们会忽略 NULL,并且只有在不存在非 NULL 值时才返回 NULL。它们返回单个值,而不是整行,因此如果要获取对应的行,我会使用带 LIMIT 的 ORDER BY,或使用窗口函数。”

快速检查

思考字符串聚合的结果。

回顾

关于 MIN 和 MAX 的全部要点:

  • 适用于任何可排序类型:数字、日期和字符串。
  • 字符串使用字母顺序/排序规则进行排序,而不是按长度排序。
  • 日期:MIN = 最早,MAX = 最晚。
  • 它们会忽略 NULL;全为 NULL 或没有行时返回 NULL。
  • 它们返回一个值,而不是整行——要获取整行,请使用 ORDER BY + LIMIT。

接下来:不使用 GROUP BY 时使用聚合函数会发生什么。

常见问题解答

「MIN、MAX 与非数值汇总」课时是免费的吗?

是的 — 「MIN、MAX 与非数值汇总」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Coding Interview Prep 课程的其余内容,请升级到 CoddyKit PRO。 Coding Interview Prep 课程共包含 4 节课。

「MIN、MAX 与非数值汇总」这节课中我会学到什么?

汇总日期和字符串,并理解文本上的 MIN 含义 你通过在浏览器中直接运行的动手代码来练习 Coding Interview Prep,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Coding Interview Prep 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Coding Interview Prep 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「MIN、MAX 与非数值汇总」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Coding Interview Prep 课中编写并运行代码吗?

能。每节 Coding Interview Prep 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. COUNT(*)、COUNT(column) 与 COUNT(DISTINCT)
  2. 包含 NULL 的 SUM 和 AVG
  3. MIN、MAX 与非数值汇总
  4. 不使用 GROUP BY 的汇总
← 返回 Coding Interview Prep