📅  最后修改于: 2020-11-30 09:03:14             🧑  作者: Mango
在本节中,我们将学习PostgreSQL ORDER BY条件,该条件用于按升序或降序对数据进行排序。并基于一列或多列来获取记录。
从表中获取记录时,SELECT命令以不确定的顺序返回行。为此,我们将在SELECT语句中使用ORDER BY子句对结果集的行进行排序。
ORDER BY子句允许我们对SELECT条件返回的行进行升序或降序排序,具体取决于排序表达式。
PostgreSQL ORDER BY条件的语法如下:
SELECT column-list
FROM table_name
[WHERE condition]
[ORDER BY column1, column2, .. columnN] [ASC | DESC];
以下是上述命令中使用的参数:
Parameter | Description |
---|---|
column_list | It is used to define the columns or calculations, which we want to retrieve. |
table_name | It is used to describe the tables that we want to retrieve records from. And there must be at least one table listed in the FROM clause. |
WHERE conditions | It is an optional parameter used to define the condition that must be fulfilled to retrieve records. |
ASC | It is also an optional parameter, and it is used to sort the result set in ascending order by expression (default, if no modifier is the provider). |
DESC | It is also an optional parameter, and it is used to sort the result set in descending order by expression. |
order by子句以以下格式工作:
它从From子句开始→之后将选择特定的列→然后按Order by子句执行。
注意:由于顺序评估,在ORDER BY子句中,我们可以在SELECT命令中使用列别名。
在这里,我们将借助以下示例了解PostgreSQL ORDER BY子句的工作方式:
为此,我们将使用在PostgreSQL教程的前面部分中创建的Employee表。
下面的屏幕快照定义了Employee表中存在的不同列:
在上表中,我们将使用order by子句执行不同类型的运算符。
在下面的示例中,我们将使用ORDER BY条件按升序按其first_name获取员工:
SELECT first_name, last_name
FROM employee
ORDER BY first_name ASC;
输出量
执行完上述命令后,我们将获得以下输出,该输出以升序获取所有first_name。
我们也可以忽略ORDER BY子句中的ASC选项,因为ASC选项是默认的,如下面的命令所示:
SELECT first_name, last_name
FROM employee
ORDER BY first_name ;
输出量
正如我们在下面的屏幕截图中看到的,我们得到的输出与上面类似:
下面的命令从Employee表中选择名字_和姓氏_ ,并按降序按last_name列中的值获取行:
SELECT first_name, last_name
FROM employee
ORDER BY first_name desc ;
输出量
执行完上述命令后,我们将获得以下输出,该输出以降序获取所有first_name 。
以下命令用于从employee表中选择first_name和last_name ,并对具有多列的行进行排序:
SELECT address, email
FROM employee
ORDER BY address ASC, email DESC;
输出量
执行完上述命令后, ORDER BY子句首先按first_name列中的值获取行。然后,它根据last_name列中的值获取行。
在下图中,我们还可以看到我们有两名雇员,他们的first_name (john)和last_name相似,并按降序排列。
在下面的示例中,我们将选择地址及其长度,这将通过employee表中的地址长度来获取行:
注意:在PostgreSQL中,列别名len是可访问的,并且在ORDER BY子句中使用,因为ORDER BY子句是在SELECT条件之后完成的。 LENGTH()函数用于获取字符串并获取特定字符串的长度。
SELECT address,
LENGTH (address) len
FROM employee
ORDER BY len DESC;
输出量
执行上述命令后,我们将获得以下结果,该结果描述了employee表中地址列的长度值。
当我们获取具有NULL值的行时,可以使用ORDER BY子句的其他LAST选项定义NULL的顺序。
在数据库中, NULL是一种表示形式,它定义缺少的记录或在记录时未指定的记录。
ORDER BY sort_expresssion [ASC | DESC] [NULLS FIRST | NULLS LAST]
在以上语法中,我们有两个最重要使用的选项:
Options | Description |
---|---|
Nulls First | It places Null before further non-null values. |
Nulls Last | It places Null after another non-null value. |
为了更好地理解,我们将创建一个表,如下所示:
CREATE TABLE demo(
num varchar
);
执行完上述命令后,我们将获得以下消息窗口;演示表已成功创建。
创建表格后,我们将在演示表格中插入一些值,如下所示:
INSERT INTO demo(num)
VALUES(1),(2),(null),(3),(4);
输出量
执行完上述命令后,我们将获得以下消息窗口;值已成功插入到演示表中。
注意:在这里,我们不需要了解CREATE TABLE和INSERT命令,因为我们想在pgAdmin或psql中执行命令来创建演示表并将值插入其中。
以下命令用于从演示表中获取记录:
SELECT num
FROM demo
ORDER BY num;
输出量
执行完上述命令后,我们将获得输出:
在此示例中,我们使用ORDER BY条件在num列中以演示表的升序获取值,该值在另一个值之后放置NULL。因此,默认情况下,如果我们使用ASC选项,则ORDER BY子句采用NULLS LAST选项。
因此,以下命令用于获取类似的结果:
SELECT num
FROM demo
ORDER BY num NULLS LAST;
输出量
执行完上述命令后,我们将得到以下结果:
我们将使用NULLS FIRST选项将NULL放置在其他非空值之前,如下所示:
SELECT num
FROM demo
ORDER BY num NULLS FIRST;
输出量
执行完上述命令后,我们将得到以下结果:
然后,在以下命令的帮助下,我们将在num列中按演示表的降序获取值:
SELECT num
FROM demo
ORDER BY num DESC;
输出量
一旦执行了以上命令,我们将获得以下输出:
执行这两个ASC和DESC命令后,我们可以看到,默认情况下,ORDER BY与DESC选项条件使用NULLS FIRST选项的输出。
我们将使用NULLS LAST选项来反转特定表中的顺序。
SELECT num
FROM demo
ORDER BY num DESC NULLS LAST;
输出量
执行完上述命令后,我们将得到以下结果: