PostgreSQL 排序显示

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

单列排序

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

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

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

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

SELECT first_name,last_name,salary FROM employees WHERE department_id = 90 ORDER BY salary DESC;

 

多列排序

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

SELECT column1, column2, ...FROM tableORDER BY column1 ASC, column2 DESC, ...;

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

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

SELECT first_name,last_name,salary FROM employees WHERE department_id = 90 ORDER BY salary,first_name DESC;

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

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

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

SELECT first_name,last_name,salaryFROM employeesORDER 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

空值排序

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

SELECT first_name,last_name,commission_pct FROM employees WHERE first_name = 'Peter'ORDER BY commission_pct;

以上查询按照佣金百分比(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 ;

posted @ 2023-07-10 09:49  晓枫的春天  阅读(776)  评论(0编辑  收藏  举报