ITPub博客

首页 > 数据库 > 数据库开发技术 > 《PostgreSQL 开发指南》第 11 篇 排序显示

《PostgreSQL 开发指南》第 11 篇 排序显示

原创 数据库开发技术 作者:BUAA_dxy 时间:2022-02-24 21:03:33 0 删除 编辑

当我们使用SELECT语句查询表中的数据时,PostgreSQL 并不确保按照一定的顺序返回结果。如果想要将查询结果按照某些规则进行排序显示,例如按照薪水从高到低,或者按照入职时间的先后进行排序,需要使用ORDER BY子句。

单列排序

单列排序是指按照某个字段或者表达式进行排序,用法如下:

SELECT column1, column2, ...
FROM table
ORDER BY column1 [ASC | DESC];

ORDER BY表示按照某个字段进行排序,ASC表示升序排序(Ascending),DESC表示降序排序(Descending),默认值为ASC。

以下查询返回部门编号为 60 的员工,并且按照薪水从高到低进行排序显示:

SELECT first_name,
last_name,
salary
FROM employees
WHERE department_id = 60
ORDER BY salary DESC;
first_name | last_name | salary
------------+-----------+---------
Alexander | Hunold | 9000.00
Bruce | Ernst | 6000.00
David | Austin | 4800.00
Valli | Pataballa | 4800.00
Diana | Lorentz | 4200.00
(5 rows)

从结果可以看到,对于第 3 行和第 4 行,它们的薪水值都是 4800。那么这两行应该如何排序显示呢?答案是不确定。如果想要解决这个问题,需要使用多列排序。

多列排序

对于单列排序,有可能存在多个数据值相同的情况。此时,可以再指定其他的排序字段进行处理。

SELECT column1, column2, ...
FROM table
ORDER BY column1 ASC, column2 DESC, ...;

首先基于第一个排序字段进行排序,对于可能存在的相同值,再基于第二个字段进行排序,依此类推。

以下查询返回部门编号为 60 的员工,并且按照薪水从高到低进行排序显示,如果薪水相同,再按照名字(first_name)降序排列:

SELECT first_name,
last_name,
salary
FROM employees
WHERE department_id = 60
ORDER BY salary DESC, first_name DESC;
first_name | last_name | salary
------------+-----------+---------
Alexander | Hunold | 9000.00
Bruce | Ernst | 6000.00
Valli | Pataballa | 4800.00
David | Austin | 4800.00
Diana | Lorentz | 4200.00
(5 rows)

此时,“Valli Pataballa”排在了“David Austin”的前面。

ORDER BY后的排序字段可以是SELECT列表中没有的字段。以下语句返回了员工的姓名和薪水,按照入职先后进行显示:

SELECT first_name,
last_name,
salary
FROM employees
ORDER BY hire_date;

除了在ORDER BY后指定字段名或者表达式之外,也可以简单的使用它们在SELECT列表中出现的顺序来表示:

SELECT first_name,
last_name,
salary
FROM employees
ORDER BY 1, 3;

以上语句表示先按照第 1 个字段(first_name)进行排序,再按照第 3 个字段(salary)进行排序。

另外,PostgreSQL 对于字符类型的数据进行排序时,不区分大小写,“CAT”和“cat”顺序相同。

CREATE TABLE tbl_char(c1 varchar(10));
INSERT INTO tbl_char VALUES('CAT'), ('cat'), ('dog');

SELECT *
FROM tbl_char
ORDER BY c1;
c1
-----
cat
CAT
dog
(3 rows)

空值排序

在 SQL 中,空值是一个特殊的值,使用NULL表示。如果排序的字段中存在空值时,应该如何处理呢?先看一个示例:

SELECT first_name,
last_name,
commission_pct
FROM employees
WHERE first_name = 'Peter'
ORDER BY commission_pct;
first_name | last_name | commission_pct
------------+-----------+----------------
Peter | Hall | 0.25
Peter | Tucker | 0.30
Peter | Vargas |
(3 rows)

以上查询按照佣金百分比(commission_pct)进行升序显示。对于“Peter Vargas”,由于他没有佣金提成,相应的值为空,PostgreSQL 默认将他排在了最后。

PostgreSQL支持使用NULLS FIRST(空值排在最前)和NULLS LAST(空值排在最后)指定空值的排序位置;升序排序时默认为NULLS LAST,降序排序时默认为NULLS FIRST。

我们修改上面的示例,将“Peter Vargas”排在最前,但仍然按照佣金百分比进行升序显示:

SELECT first_name,
last_name,
commission_pct
FROM employees
WHERE first_name = 'Peter'
ORDER BY commission_pct NULLS FIRST;
first_name | last_name | commission_pct
------------+-----------+----------------
Peter | Vargas |
Peter | Hall | 0.25
Peter | Tucker | 0.30
(3 rows)

原文作者:SQL编程思想;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论
《SQL编程思想》作者,专注于数据库领域知识的分享。

注册时间:2021-08-26

  • 博文量
    443
  • 访问量
    546980