CodeGym /课程 /SQL SELF /数据排序(ORDER BY):升序和降序排序(ASC, DESC)

数据排序(ORDER BY):升序和降序排序(ASC, DESC)

SQL SELF
第 2 级, 课程 3
可用

你在玩数据库的时候,经常会想让数据有点顺序。比如:

  • “给我看下最贵的前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 查询效率高一半!冲下一个知识点吧!😉

2
任务
SQL SELF, 第 2 级, 课程 3
已锁定
按升序排序
按升序排序
2
任务
SQL SELF, 第 2 级, 课程 3
已锁定
按降序排序
按降序排序
1
调查/小测验
SQL入门第 2 级,课程 3
不可用
SQL入门
SQL入门
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION