你在玩数据库的时候,经常会想让数据有点顺序。比如:
- “给我看下最贵的前10个商品。”
- “哪些订单是最新的?”
- “学生的年龄,从最小的开始排?”
想让数据有序很正常:就算你是超级牛的程序员,面对一堆乱七八糟的行也会头大。所以 SQL 给了我们一个工具来让返回的行有顺序 —— ORDER BY 操作符。
用 ORDER BY 排序的基础
ORDER BY 就像魔法棒一样,可以让结果集里的行有序。不用它的话,数据返回是“随便”的顺序(不是数据库出错,只是顺序没保证)。
它的语法长这样:
SELECT 列1, 列2
FROM 表
ORDER BY 列1 DESC;
列1:你想按哪个列排序就写哪个列名。ASC:升序排序(默认值,可以省略)。DESC:降序排序。
例子
假设我们有个 students 表:
| id | name | age |
|---|---|---|
| 1 | Alex | 22 |
| 2 | Maria | 19 |
| 3 | Otto | 21 |
我们来按年龄升序排下学生:
SELECT name, age
FROM students
ORDER BY age ASC;
结果:
| name | age |
|---|---|
| Maria | 19 |
| Otto | 21 |
| Alex | 22 |
如果把排序方向改成降序:
SELECT name, age
FROM students
ORDER BY age DESC;
结果就变成这样:
| name | age |
|---|---|
| Alex | 22 |
| Otto | 21 |
| Maria | 19 |
按多个列排序
有时候一个列还不够。比如有好几个学生年龄一样,你还想再按名字排下顺序。
多列排序的写法:
SELECT 列1, 列2
FROM 表
ORDER BY 列1 DESC, 列2 ASC;
举个例子,假如表是这样的:
| id | name | age |
|---|---|---|
| 1 | Alex | 22 |
| 2 | Maria | 19 |
| 3 | Otto | 21 |
| 4 | Anna | 19 |
SQL:
SELECT name, age
FROM students
ORDER BY age ASC, name ASC;
结果:
| name | age |
|---|---|
| Anna | 19 |
| Maria | 19 |
| Otto | 21 |
| Alex | 22 |
这里先按年龄升序排,然后同年龄的再按名字字母顺序排。
用别名排序
如果你给列起了别名(alias),也可以直接用别名排序。
SELECT name AS "名字", age AS "年龄"
FROM students
ORDER BY "年龄" DESC;
结果:
| 名字 | 年龄 |
|---|---|
| Alex | 22 |
| Otto | 21 |
| Maria | 19 |
为啥这个重要?因为以前不支持,按计算列排序会很麻烦。
按计算列排序
SQL 允许你直接在查询里做计算,然后按计算结果排序。
例子1,最简单的计算:
SELECT name, age, age * 2 AS doubled_age
FROM students
ORDER BY doubled_age DESC;
结果:
| name | age | doubled_age |
|---|---|---|
| Alex | 22 | 44 |
| Otto | 21 | 42 |
| Maria | 19 | 38 |
例子2,用函数。假如我们有个 products 表存商品价格:
| product_name | price |
|---|---|
| 商品A | 100 |
| 商品B | 200 |
| 商品C | 150 |
现在我们按打完九折后的价格排序,用 ROUND 函数把结果四舍五入。
SELECT product_name, price, ROUND(price * 0.9, 1) AS discounted_price
FROM products
ORDER BY discounted_price ASC;
结果如下:
| product_name | price | discounted_price |
|---|---|---|
| 商品A | 100 | 90 |
| 商品C | 150 | 135 |
| 商品B | 200 | 180 |
排序的实际应用
排序在这些场景里特别有用:
- 做报表,比如每月销量前10名。
- 给前端页面展示,比如订单列表按日期排。
- 做分析用的分组,比如按优先级分组。
用 ORDER BY 时常见的坑
坑点随时可能踩,注意这些:
- 如果你按不存在的列排序,会报错:
column "not_a_column" does not exist。 - 按别名排序,如果别名是计算列,有时候会让人懵,尤其是别名在更高一层定义的时候。
- 如果你忘了写排序方向,PostgreSQL 默认用
ASC。这不是错,但可能结果和你想的不一样。
现在你已经会用 ORDER BY 在 PostgreSQL 里玩转排序了。记住,数据排得好,SQL 查询效率高一半!冲下一个知识点吧!😉
GO TO FULL VERSION