PostgreSQL 行排序详解

在查询生成输出表之后,也就是在处理完选择列表之后,你还可以对输出表进行排序。

如果没有排序,那么行将以不可预测的顺序返回(实际顺序将取决于扫描和连接规划类型和在磁盘上的顺序,

但是肯定不能依赖这些东西)。确定的顺序只能在明确地使用了排序步骤之后才能保证。

ORDER BY子句用于声明排序顺序:

SELECT _select_list_
    FROM _table_expression_
    ORDER BY _sort_expression1_ [ASC | DESC] [NULLS { FIRST | LAST }]
             [, `_sort_expression2_` [ASC | DESC] [NULLS { FIRST | LAST }] ...]

sort_expression 是任何可用于选择列表的表达式,可以将不同列相加减乘除后排序,例如:

SELECT a, b FROM table1 ORDER BY a + b, c;

如果指定了多个排序表达式,那么仅在前面的表达式排序相等的情况下才使用后面的表达式做进一步排序。

每个表达式都可以跟一个可选的ASC(升序,默认) 或DESC(降序)以设置排序方向。 升序先输出小的数值,这里的"小"是以<操作符的角度定义的。

类似的是,降序是以>操作符来判断的。

NULLS FIRSTNULLS LAST选项可以决定在排序操作中在 non-null 值之前还是之后。

默认情况下,空值大于任何非空值;也就是说,DESC 排序默认是NULLS FIRST,否则为NULLS LAST

注意,排序选项对于每个排序列是相对独立的。例如ORDER BY x, y DESC 意思是说ORDER BY x ASC, y DESC

不同于ORDER BY x DESC, y DESC

一个_sort_expression_也可以是字段名或字段编号,如:

SELECT a + b AS sum, c FROM table1 ORDER BY sum;
SELECT a, max(b) FROM table1 GROUP BY a ORDER BY 1;

都按照第一个字段进行排序。

需要注意的是,输出字段名必须是独立的(不允许在表达式中使用)。

比如,下面的语句是错误的:

SELECT a + b AS sum, c FROM table1 ORDER BY sum + c;          -- 错误的

这样的限制主要是为了避免歧义。另外,如果某个排序表达式能够同时匹配输出字段名和表表达式中的字段名, 也会导致歧义(此时使用输出字段名)。

当然,这种情况仅在你使用了AS 重命名输出字段并且恰好与其它表的字段同名的时候才会发生。

ORDER BY可以应用于UNIONINTERSECT,EXCEPT 组合的计算结果,

不过在这种情况下,只允许按照字段的名字或编号进行排序,而不允许按照表达式进行排序。

Notes

[1] 事实上,PostgreSQL使用默认的B-tree操作符类 为表达式的数据类型确定ASCDESC排序顺序。

一般来说,数据类型将被转换为适合于 <和 >操作符进行排序。但是对于用户自定义的数据类型可以不必如此。

原文地址:https://www.cnblogs.com/ryanzheng/p/9813974.html

时间: 2024-10-26 08:52:16

PostgreSQL 行排序详解的相关文章

Excel2010排序详解

我倒是要看看这一天一篇的发表频率,能让我自己坚持多长时间. 今天跟大家分享的主要内容是在Excel中的筛选功能,这个功能应该是谁都用过,把一列数据按照从大到小,从小到大的,有意义或无意义的排列着.这个方法大家都会,用着几个按钮就都能搞定. 稍微复杂点的操作呢,比如按多关键字排序,按照单元格颜色排序,局部排序,按行横向排序,excel是如何完成的呢?耐心往下看. 1 按照多关键字排序.先看数据源,先按单据编号排序,在单据编号相同的情况下,按照商品编号排序,如果商品编号再相同,就按单据日期排序.这个

monkey命令行参数详解

monkey命令行参数详解:http://blog.sina.com.cn/s/blog_6fc352ca01017fsf.html Monkey的使用:http://blog.csdn.net/bruce_ke/article/details/8470252

sed行处理详解 :交换行,合并行,删除行

sed行处理详解(交换行,合并行,删除行 多行合并一行:  cat xai 303728 303778 304175 304176 304261 304470 awk '{if(NR%2==0){printf $0 "\n"}else{printf "%s:",$0}}' xai  303728:303778 304175:304176 304261:304470  sed 'N;s/\n/ :/' xai  303728 :303778 304175 :30417

VLC命令行参数详解

VLC命令行参数详解 2012-11-29 14:00 6859人阅读 评论(0) 收藏 举报 Usage: vlc [options] [stream] ...You can specify multiple streams on the commandline. They will be enqueued in the playlist.The first item specified will be played first. Options-styles:  --option  A gl

极角排序详解:

极角排序详解 名词释义: 在平面内取一个定点O,叫极点,引一条射线Ox,叫做极轴,再选定一个长度单位和角度的正方向(通常取逆时针方向).对于平面内任何一点M,用ρ表示线段OM的长度(有时也用r表示),θ表示从Ox到OM的角度,ρ叫做点M的极径,θ叫做点M的极角,有序数对 (ρ,θ)就叫点M的极坐标 四种极角排序代码详解: 1 struct point 2 { 3 double x,y; 4 }; 5 6 double cross(double x1,double y1,double x2,dou

python的sorted排序详解

排序,在编程中经常遇到的算法,我也在几篇文章中介绍了一些关于排序的算法.有的高级语言内置了一些排序函数.本文讲述Python在这方面的工作.供使用python的程序员们参考,也让没有使用python的朋友了解python.领略一番"生命有限,请用Python"的含义. 内置函数sorted()/list.sort()的使用 简单应用 python对list有一个内置函数:sorted(),专门用于排序.举例: >>> a=[5,3,6,1,9,2] >>&

数据结构与算法分析之----各种常用排序详解

1.选择排序 思想:在需要进行排序的序列中,每次把最小(或最大)的交换到最左边的位置 案例: 待排序数组: 5 2 6 8 4 1 选择过程:    5 2 6 8 4 1 => 2 5 6 8 4 1 => 1 5 6 8 4 2 => 1 4 6 8 5 2 => 1 2 6 8 5 4 => 1 2 5 8 6 4 => 1 2 4 8 6 5... 2.冒泡排序 思想:在需要进行排序的序列中,每次把最小(或最大)的推到最顶端,像气泡一样往上冒 案例: 待排序

ios label 自动计算行高详解

在OC当中自动计算行高主要调用系统的 p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #ffffff } span.s1 { } span.s2 { color: #00b1ff } span.s3 { color: #de38a6 } span.s4 { color: #eb905a } span.s5 { color: #8b87ff } - (--boundingRectWithSize:(CGSize)

图论-拓扑排序详解

拓扑排序(topsort)详解 这篇随笔就信息学奥林匹克竞赛中图论的一个知识点--拓扑排序进行讲解.拓扑排序的内容比较基础,只要求读者学习过并了解信息学中图的相关定义和一些专业名词,但是拓扑排序的变形题目比较多,希望读者在看完本随笔后认真体会练习,掌握拓扑排序. 上课! 拓扑排序的定义 顾名思义,这是一种排序,确切地说,是一种图上排序,在一张有向无环图(注解:有向无环图即很多参考书和题解中所说的DAG)上进行排序,把其中的所有节点排成一个序列,使得图中的任意一对有边相连的节点(u,v)u要出现在