您的位置:首页 > 数据库

PostgreSQL 从入门到出门 第 11 章 排序显示

2019-05-13 11:00 681 查看
版权声明:本站不全为博主原创文章,欢迎转载,转载记得标明出处。^-^ https://blog.csdn.net/horses/article/details/90167209

文章目录

当我们使用

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)

人生本来短暂,你又何必匆匆!点个赞再走吧!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: