八月 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
选项对行进行降序排序。如果省略ASC
或DESC
选项,则ORDER BY
默认使用ASC
。
PostgreSQL 按以下顺序执行SELECT
语句中的子句: FROM
、SELECT
和ORDER BY
:
按照执行的顺序,如果SELECT
语句中有列别名,则可以在ORDER BY
子句中使用它。
让我们看一些使用 PostgreSQL 的ORDER BY
子句的示例。
PostgreSQL ORDER BY 示例
我们将使用示例数据库中的customer
表进行演示。
1) 使用 ORDER BY 子句按一列对行进行排序
以下查询使用ORDER BY
子句按客户的名字对客户进行升序排序:
SELECT
first_name,
last_name
FROM
customer
ORDER BY
first_name ASC;
由于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;
3) 使用 ORDER BY 子句按多列对行进行排序
以下语句从客户表中查询名字和姓氏,并按名字升序和姓氏降序对行进行排序:
SELECT
first_name,
last_name
FROM
customer
ORDER BY
first_name ASC,
last_name DESC;
在此示例中,ORDER BY 子句首先按名字列中的值对行进行排序。然后它按姓氏列中的值对已排序的行进行排序。
从输出中可以清楚地看到,两个具有相同名字Kelly
的客户的按姓氏降序排列。
4) 使用 ORDER BY 子句按表达式对行进行排序
LENGTH()
函数接受一个字符串并返回该字符串的长度。
以下语句查询名字及其长度。它按名字的长度对行进行排序:
SELECT
first_name,
LENGTH(first_name) len
FROM
customer
ORDER BY
len DESC;
由于ORDER BY
子句是在SELECT
列表之后求值的,因此列别名len
可用并且可以在ORDER BY
子句中使用。
PostgreSQL ORDER BY 子句和 NULL
在数据库世界中,NULL
是一个标记,指示丢失的数据或数据在记录时未知。
对包含NULL
的行进行排序时,可以使用ORDER BY
子句的NULLS FIRST
或NULLS 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 TABLE
和INSERT
语句。您只需从pgAdmin
或psql
执行它创建sort_demo
表并向其中插入数据。
以下查询返回sort_demo
表中的数据:
SELECT num
FROM sort_demo
ORDER BY num;
在此示例中,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;
以下语句对sort_demo
表的num
列中的值进行降序排序:
SELECT num
FROM sort_demo
ORDER BY num DESC;
从输出中可以清楚地看到,带有DESC
选项的ORDER BY
子句默认使用NULLS FIRST
。
要反转顺序,您可以使用NULLS LAST
选项:
SELECT num
FROM sort_demo
ORDER BY num DESC NULLS LAST;
概括
- 使用
SELECT
语句中的ORDER BY
子句对行进行排序。 - 使用
ASC
选项对行进行升序排序和DESC
选项对行进行降序排序。ORDER BY
子句默认使用ASC
选项。 - 使用
NULLS FIRST
和NULLS LAST
选项显式指定NULL
与其他非空值的顺序。