PostgreSQL 教程: ORDER BY 排序

八月 30, 2023

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

PostgreSQL ORDER BY 子句简介

当您从表中查询数据时,SELECT语句以未指定的顺序返回行。要对结果集的行进行排序,请在SELECT语句中使用ORDER BY子句。

ORDER BY子句允许您根据排序表达式按升序或降序对SELECT语句返回的行进行排序。

下面说明了ORDER BY子句的语法:

SELECT
	select_list
FROM
	table_name
ORDER BY
	sort_expression1 [ASC | DESC],
        ...
	sort_expressionN [ASC | DESC];

在这个语法中:

  • 首先,指定一个排序表达式,可以是要在ORDER BY关键字之后排序的列或表达式。如果要根据多个列或表达式对结果集进行排序,则需要在两个列或表达式之间放置逗号 (,) 来分隔它们。
  • 其次,您可以使用ASC选项对行进行升序排序,以及DESC选项对行进行降序排序。如果省略ASCDESC选项,则ORDER BY默认使用ASC

PostgreSQL 按以下顺序执行SELECT语句中的子句: FROMSELECTORDER BY

img

按照执行的顺序,如果SELECT语句中有列别名,则可以在ORDER BY子句中使用它。

让我们看一些使用 PostgreSQL 的ORDER BY子句的示例。

PostgreSQL ORDER BY 示例

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

customer table

1) 使用 ORDER BY 子句按一列对行进行排序

以下查询使用ORDER BY子句按客户的名字对客户进行升序排序:

SELECT
	first_name,
	last_name
FROM
	customer
ORDER BY
	first_name ASC;

PostgreSQL ORDER BY one column example

由于ASC选项是默认选项,因此您可以在ORDER BY子句中省略它,如下所示:

SELECT
	first_name,
	last_name
FROM
	customer
ORDER BY
	first_name;

2) 使用 ORDER BY 子句按一列对行进行降序排序

以下语句从customer表中查询名字和姓氏,并按姓氏列中的值对行进行降序排序:

SELECT
       first_name,
       last_name
FROM
       customer
ORDER BY
       last_name DESC;

PostgreSQL ORDER BY one column DESC example

3) 使用 ORDER BY 子句按多列对行进行排序

以下语句从客户表中查询名字和姓氏,并按名字升序和姓氏降序对行进行排序:

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

PostgreSQL ORDER BY multiple columns

在此示例中,ORDER BY 子句首先按名字列中的值对行进行排序。然后它按姓氏列中的值对已排序的行进行排序。

从输出中可以清楚地看到,两个具有相同名字Kelly的客户的按姓氏降序排列。

4) 使用 ORDER BY 子句按表达式对行进行排序

LENGTH()函数接受一个字符串并返回该字符串的长度。

以下语句查询名字及其长度。它按名字的长度对行进行排序:

SELECT 
	first_name,
	LENGTH(first_name) len
FROM
	customer
ORDER BY 
	len DESC;

PostgreSQL ORDER BY expressions

由于ORDER BY子句是在SELECT列表之后求值的,因此列别名len可用并且可以在ORDER BY子句中使用。

PostgreSQL ORDER BY 子句和 NULL

在数据库世界中,NULL是一个标记,指示丢失的数据或数据在记录时未知。

对包含NULL的行进行排序时,可以使用ORDER BY子句的NULLS FIRSTNULLS LAST选项,指定NULL与其他非空值的顺序:

ORDER BY sort_expresssion [ASC | DESC] [NULLS FIRST | NULLS LAST]

NULLS FIRST选项将NULL放置在其他非空值之前,NULL LAST选项将NULL放置在其他非空值之后。

让我们创建一个表来进行演示。

-- create a new table
CREATE TABLE sort_demo(
	num INT
);

-- insert some data
INSERT INTO sort_demo(num)
VALUES(1),(2),(3),(null);

请注意,您不需要理解CREATE TABLEINSERT语句。您只需从pgAdminpsql执行它创建sort_demo表并向其中插入数据。

以下查询返回sort_demo表中的数据:

SELECT num
FROM sort_demo
ORDER BY num;

img

在此示例中,ORDER BY子句按升序对sort_demo表的num列中的值进行排序。它将NULL置于其他值之后。

因此,如果您使用ASC选项,ORDER BY子句默认使用NULLS LAST选项。因此,以下查询返回相同的结果:

SELECT num
FROM sort_demo
ORDER BY num NULLS LAST;

要放置NULL在其他非空值之前,可以使用NULLS FIRST选项:

SELECT num
FROM sort_demo
ORDER BY num NULLS FIRST;

img

以下语句对sort_demo表的num列中的值进行降序排序:

SELECT num
FROM sort_demo
ORDER BY num DESC;

img

从输出中可以清楚地看到,带有DESC选项的ORDER BY子句默认使用NULLS FIRST

要反转顺序,您可以使用NULLS LAST选项:

SELECT num
FROM sort_demo
ORDER BY num DESC NULLS LAST;

img

概括

  • 使用SELECT语句中的ORDER BY子句对行进行排序。

  • 使用ASC选项对行进行升序排序和DESC选项对行进行降序排序。ORDER BY子句默认使用ASC选项。

  • 使用NULLS FIRSTNULLS LAST选项显式指定NULL与其他非空值的顺序。