SQL Academy · 课时

查找前 N 条记录

获取最高值和最低值

第 4 / 4 课13 个步骤

查找前 N 条记录 是 CoddyKit 上的免费 SQL Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 SQL Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 SQL Academy 课程共包含 4 节课。

什么是前 N 名查询

前 N 名查询可以回答这样的问题:“价格最高的 3 个产品”“最新的 10 个订单”或“分数最低的 5 行”。

它其实只是排序加上数量限制,但使用得非常普遍,因此值得拥有一个专门的名称。

-- Top 3 most expensive products
SELECT name, price
FROM products
ORDER BY price DESC
LIMIT 3;

最低 N 条记录

对于最小的值,请反转排序方向。按 ASC 排序并取前 N 条,即可得到价格最低、时间最早或分数最低的行。

-- 5 cheapest products
SELECT name, price
FROM products
ORDER BY price ASC
LIMIT 5;

添加打破平局的键

如果多行共享临界值,数据库会在其中任意选择。请添加唯一的次级键,使结果稳定且可复现。

SELECT id, name, price
FROM products
ORDER BY price DESC, id
LIMIT 3;

筛选后的前 N 名

前 N 名查询作用于筛选后的集合。请先使用 WHERE 子句限制候选项,然后进行排序并限制数量。

这样可以找到“图书”类别中价格最高的 3 个产品。

SELECT name, price
FROM products
WHERE category = 'Books'
ORDER BY price DESC
LIMIT 3;

聚合后的前 N 名

您也可以对计算出的值进行排名。先执行 GROUP 和聚合,再对聚合结果排序并限制数量。

这样会返回总消费金额最高的 5 位客户。

SELECT customer_id, SUM(total) AS spent
FROM orders
GROUP BY customer_id
ORDER BY spent DESC
LIMIT 5;

使用排名函数

像 ROW_NUMBER() 这样的窗口函数会为每一行分配一个排名。将查询嵌套起来,只保留排名较小的行。这种方法可以扩展到“每组前 N 名”。

SELECT name, price
FROM (
  SELECT name, price,
         ROW_NUMBER() OVER (ORDER BY price DESC) AS rn
  FROM products
) ranked
WHERE rn <= 3;

处理并列时 RANK 与 ROW_NUMBER 的区别

ROW_NUMBER() 始终分配互不相同的编号,因此即使存在并列,也会准确返回 N 行。RANK() 会为并列行分配相同的编号,因此如果第三名出现并列,“前 3 名”可能会返回超过 3 行。

SELECT name, price,
       RANK() OVER (ORDER BY price DESC) AS rnk
FROM products;

每组前 N 名

要获取每个类别中排名最高的产品,请按类别对排名进行分区。PARTITION BY 会为每个组重新开始编号。

SELECT category, name, price
FROM (
  SELECT category, name, price,
         ROW_NUMBER() OVER (
           PARTITION BY category
           ORDER BY price DESC
         ) AS rn
  FROM products
) t
WHERE rn = 1;

使用 DISTINCT ON 为每组选择一行

PostgreSQL 的 DISTINCT ON 是一种简洁的方式,可为每组选择排名最高的行。请列出分组列,然后进行排序,使目标行在每个组内排在最前面。

SELECT DISTINCT ON (category)
       category, name, price
FROM products
ORDER BY category, price DESC;

使用 WITH TIES 包含并列项

如果您想要前 3 名,同时也想包含所有与第三名并列的行,请使用标准的 FETCH ... WITH TIES。它会返回 3 行,以及所有与最后一行并列的额外行。

SELECT name, price
FROM products
ORDER BY price DESC
FETCH FIRST 3 ROWS WITH TIES;

单个最高值

如果只需要最高或最低的一行,ORDER BY ... LIMIT 1 是最简单的模式,比使用 MAX() 的子查询更清晰,而且通常更快。

-- The single most recent order
SELECT id, total, created_at
FROM orders
ORDER BY created_at DESC
LIMIT 1;

快速检查

您想要价格最高的前 3 行,但如果第三名出现并列,则希望全部包含。

回顾

现在您已经掌握了查找前 N 名记录的各种重要方式:

  • ORDER BY ... LIMIT n 用于简单的最高值或最低值列表
  • 添加唯一的平局裁决键,以获得稳定的结果
  • 使用 ROW_NUMBER() 或 DISTINCT ON 查找每组前 N 名
  • 使用 FETCH ... WITH TIES 保留并列行

排序、限制数量和前 N 名查询的内容就到这里。现在您可以让任何结果集都井然有序。

SELECT name, price
FROM products
ORDER BY price DESC, id
LIMIT 3;
免费开始

用 AI 导师学习 SQL — 免费

在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。

课程
46
课程
183

常见问题解答

「查找前 N 条记录」课时是免费的吗?

是的 — 「查找前 N 条记录」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 SQL Academy 课程的其余内容,请升级到 CoddyKit PRO。 SQL Academy 课程共包含 4 节课。

「查找前 N 条记录」这节课中我会学到什么?

获取最高值和最低值 你通过在浏览器中直接运行的动手代码来练习 SQL Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 SQL Academy 需要有经验吗?

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

「查找前 N 条记录」课时需要多长时间?

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

我能在这节 SQL Academy 课中编写并运行代码吗?

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

此课程中的所有课时

  1. 使用 ORDER BY 排序
  2. 按多个列排序
  3. LIMIT 与 OFFSET
  4. 查找前 N 条记录
← 返回 SQL Academy