查找前 N 条记录
获取最高值和最低值
查找前 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 反馈 — 无需本地设置。
此课程中的所有课时
- 使用 ORDER BY 排序
- 按多个列排序
- LIMIT 与 OFFSET
- 查找前 N 条记录