提要:在本教程中,您将学习如何使用 PostgreSQL 的 ORDER BY 子句对 SELECT 语句返回的结果集进行排序。

PostgreSQL ORDER BY 子句简介

当从一个表中查询数据时,PostgreSQL 按照它们被插入到表中的顺序返回这些行。可以在SELECT 语句中使用 ORDER BY 子句对结果集进行指定规则的排序。

ORDER BY 子句允许你根据指定的条件对从 SELECT 语句返回的行进行升序或降序排序。ORDER BY 子句的语法如下:

SELECT
 column_1,
 column_2
FROM
 tbl_name
ORDER BY
 column_1 ASC, //升序,和省略 ASC 的效果一样
 column_2 DESC //降序
 ;

下面解释一下这个语法的相关细节:

  • 首先,指定要通过 ORDER BY 进行排序的字段。如果要基于多个字段进行排序,那么多个字段之间用英文逗号(,)分隔。
  • 然后,使用 ASC 来进行由小到大排序(升序); 使用 DESC 来进行由大到小排序(降序)。如果没有指定,则默认使用 ASC

来看一些使用 ORDER BY 的示例。

PostgreSQL ORDER BY 示例

我们将使用示例数据库 中的 customers 表进行演示:

customers表结构

下面的语句将按 first_name 字段(客户名字),小到大的方式进行排序:

SELECT
 first_name,
 last_name
FROM
 customer
ORDER BY
 first_name ASC;

first name asc

提示:字段的“大小”是由该字符的编码决定的,比如 ASCII 码。上例中 'Aaron' 和 'Adam'的第一个字母相同,那么,会继续比较第二个字符。第二个字符里,a 字母的 ASCII 码小于 d 字母的 ASCII 码,所以 'Aaron' 比 'Adam' 小。对于中文来说,原理也是一样的。不同的是,中文使用的不是 ASCII 码——取决于创建数据库时指定的编码。

因为 ORDER BY 默认使用的就是 ASC,所以如果是按升序排序,在SQL语句中,可以省略 ASC

如果你想按客户姓氏(last_name字段)由大到小来排序,可以使用 DESC 关键字,如下例所示:

SELECT
       first_name,
       last_name
FROM
       customer
ORDER BY
       last_name DESC;

last name desc

如果你想先按名字(first_name字段)由小到大排序,在名字相同的数据里,再按姓氏(last_name字段)由大到小排序,可以使用下面的语句:

SELECT
 first_name,
 last_name
FROM
 customer
ORDER BY
 first_name ASC,
 last_name DESC;

综合

SQL 标准规定,只能使用 SELECT 语句里出现过的字段进行排序。但 PostgreSQL 允许使用没有在 SELECT 语句里出现的字段进行排序——前提是,数据表中有该字段。

遵循 SQL 标准是一种很好的做法,它会让代码具有可移植性并适应下一版 PostgreSQL 中可能发生的变化。

下一篇:PostgreSQL的WHERE