0Pricing
SQL Academy · 课时

按多个列排序

使用次级排序键打破平局

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

并列问题

按单列排序时,具有相同值的行之间没有确定的顺序。三个价格均为 20 的产品可能以任意顺序返回。

若要使顺序完全可预测,请添加第二个排序键。

-- Ties on price are ordered arbitrarily
SELECT name, price
FROM products
ORDER BY price;

列出多个排序键

ORDER BY 接受以逗号分隔的列列表。数据库先按第一列排序,然后用第二列解决并列,依此类推。

这里,产品先按价格排序;价格相同时,再按名称的字母顺序排列。

SELECT name, price
FROM products
ORDER BY price, name;

排序键的顺序很重要

列的顺序会改变结果。ORDER BY price, name 与 ORDER BY name, price 并不相同。

第一个键是主要排序依据;只有前面的键出现并列时,后续键才会发挥作用。

-- Primary sort by category, then by name within each category
SELECT category, name
FROM products
ORDER BY category, name;

逐列指定方向

每个排序键都可以有自己的方向。您可以自由混合使用 ASC 和 DESC。

这会按字母顺序对类别分组,但在每个类别内将价格最高的项目列在最前面。

SELECT category, name, price
FROM products
ORDER BY category ASC, price DESC;

DESC 逐列生效

一个常见错误是:以为末尾的 DESC 会反转所有内容。它只影响紧跟在它后面的列。

在 ORDER BY category, price DESC 中,category 仍按升序排列;只有 price 按降序排列。

-- category: ASC, price: DESC
SELECT category, price
FROM products
ORDER BY category, price DESC;

三个或更多排序键

您可以串联任意多个所需的排序键。只有当前面所有排序键都相等时,才会使用当前键。

先按日期、再按客户排序,最后在客户和日期相同的情况下按总额排序。

SELECT created_at, customer_id, total
FROM orders
ORDER BY created_at DESC, customer_id, total DESC;

稳定且确定的排序

若要获得完全确定的结果,请以唯一列(例如主键)作为最后一个排序键。这样任意两行都不可能出现并列。

这对分页很重要,您将在下一课中看到这一点。

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

混合使用表达式和列

排序键可以由普通列和表达式混合组成。每个键都是独立的。

这会按库存价值降序排列,然后以名称字母顺序作为并列时的次级排序。

SELECT name, price, stock
FROM products
ORDER BY price * stock DESC, name ASC;

按布尔值排序以调整分组位置

一个实用技巧:按布尔表达式排序,可以将某个分组推到顶部或底部。在 PostgreSQL 中,false 排在 true 之前。

这会先显示有库存的项目(库存 > 0),然后在每个分组内按价格从低到高排列。

SELECT name, stock, price
FROM products
ORDER BY (stock = 0), price;

控制 NULL 的位置

默认情况下,在 PostgreSQL 中,NULL 在升序中排在最后,在降序中排在最前。您可以在任意排序键上使用 NULLS FIRST 或 NULLS LAST 覆盖此行为。

SELECT name, discount
FROM products
ORDER BY discount DESC NULLS LAST;

综合运用

一个实际的多键排序可能会结合排序方向、表达式和 NULL 处理。请从左到右阅读:每个键都会进一步细化前一个键。

SELECT category, name, price, rating
FROM products
ORDER BY category ASC,
         rating DESC NULLS LAST,
         price ASC;

快速检查

请考虑 ORDER BY category, price DESC。

回顾

多列排序概要:

  • 用逗号分隔列出排序键;前面的键优先
  • 每个键都有自己的 ASC/DESC
  • 以唯一列结尾,以获得确定的顺序
  • 使用 NULLS FIRST/NULLS LAST 控制缺失值

接下来,您将使用 LIMIT 和 OFFSET 限制返回的行数。

SELECT category, name, price
FROM products
ORDER BY category ASC, price DESC, id;

常见问题解答

「按多个列排序」课时是免费的吗?

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

「按多个列排序」这节课中我会学到什么?

使用次级排序键打破平局 你通过在浏览器中直接运行的动手代码来练习 SQL Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 SQL Academy 需要有经验吗?

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

「按多个列排序」课时需要多长时间?

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

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

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

此课程中的所有课时

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