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)
人生本来短暂,你又何必匆匆!点个赞再走吧!
相关文章推荐
- 在GridView表头显示排序方向
- 算法入门--堆排序(最大堆,从小到大排序)
- 蓝桥杯入门训练 - 数列排序
- MTK个人入门笔记(歌词显示开关,开关机声音,关机设置为静音,抓CMAERA的trace,CAMERA_sensor的initialization)
- Symbian游戏编程入门 (四)图形显示
- JavaScript italics方法入门实例(把字符串显示为斜体)
- 算法导论第二章算法入门2.1 插入排序
- [03] 使用 MVC 5 的 EF6 Code First 入门 系列:排序、筛选和分页
- Swt/Jface tableViewer入门教程一(显示tableViewer)
- lesson 9:编写一个应用程序,用户分别从两个文本框输入学术的姓名和分数,程序按成绩排序将这些学生的姓名和分数显示在一个文本区中。
- ReportStudio入门教程(十四) - 隐藏后的单元格显示
- JSP 入门 HTML嵌套Java脚步 显示时间
- js入门·动态的时钟,显示完整的一些方法,新年倒计时
- PostgreSQL DBA快速入门(一) - 准备和部署
- 机试指南经典入门-排序
- PostgreSQL入门到精通——世界上功能最强大的开源数据库
- PostgreSQL的存储过程简单入门
- 理解SQLSERVER中的排序规则,解决无法正确显示中文字符的问题
- ASP.Net2.0 GridView 多列排序,显示排序图标,分页
- GridView常用操作与技巧---格式化突出显示、增删改、排序、编号、换行、对话框、翻页、求和等