按多个列排序
使用次级排序键打破平局
按多个列排序 是 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 反馈 — 无需本地设置。