SORT BY
描述
返回按用户指定顺序在每个分区内排序的结果行。 如果有多个分区,SORT BY 可能返回部分有序的结果。 这与 ORDER BY 子句不同,后者可保证输出的总序。
语法
SORT BY { expression [ sort_direction nulls_sort_oder ] } [, ...]
sort_direction
[ ASC | DEC ]
nulls_sort_order
[ NULLS FIRST | NULLS LAST ]
参数
expression
任意类型的表达式,用于建立结果返回时所采用的分区本地顺序。
如果该表达式为文本 INT 值,则会将其解释为选择列表中的某个列位置。
sort_direction
指定 sort by 表达式的排序顺序。
- ASC 此表达式的排序方向为升序
- DESC 此表达式的排序方向为降序
如果未显式指定排序方向,则默认按升序对行排序。
nulls_sort_order
可选择指定是在非 NULL 值之前还是之后返回 NULL 值。 如果未指定 null_sort_order,则在排序顺序为 ASC 时,Null 排在前面;排序顺序为 DESC 时,Null 排在后面。
- NULLS FIRST 首先返回 NULL 值,不考虑排序顺序。
- NULLS LAST 最后返回 NULL 值,不考虑排序顺序。
在指定多个表达式时,从左向右进行排序。 分区中的所有行按第一个表达式排序。 如果第一个表达式有重复的值,则使用第二个表达式来解析重复项组中的顺序,依此类推。 如果所有 order by 表达式中都有重复值,则生成的顺序不确定。
示例 语句未生效
CREATE TABLE person (id INT, name STRING, age INT);
INSERT INTO person VALUES
(100, 'John' , 30),
(200, 'Mary' , NULL),
(300, 'Mike' , 80),
(400, 'Jerry', NULL),
(500, 'Dan' , 50);
-- Comparison operator in `WHERE` clause.
SELECT name, age FROM person SORT BY age;
+---------+-----------+
| name| age|
+---------+-----------+
| Mary| NULL|
+---------+-----------+
| Jerry| NULL|
+---------+-----------+
| John| 30|
+---------+-----------+
| Dan| 50|
+---------+-----------+
| Mike| 80|
+---------+-----------+
SELECT name, age FROM person ORDER BY age DESC;
+---------+-----------+
| name| age|
+---------+-----------+
| Mike| 80|
+---------+-----------+
| Dan| 50|
+---------+-----------+
| John| 30|
+---------+-----------+
| Mary| NULL|
+---------+-----------+
| Jerry| NULL|
+---------+-----------+
SELECT * FROM person ORDER BY name ASC, age DESC;
+---------+-----------+----------+
| id| name| age|
+---------+-----------+----------+
| 500| Dan| 50|
+---------+-----------+----------+
| 400| Jerry| NULL|
+---------+-----------+----------+
| 100| John| 30|
+---------+-----------+----------+
| 200| Mary| NULL|
+---------+-----------+----------+
| 300| Mike| 80|
+---------+-----------+----------+
SELECT * FROM person ORDER BY ALL ASC;
+---------+-----------+----------+
| id| name| age|
+---------+-----------+----------+
| 100| John| 30|
+---------+-----------+----------+
| 200| Mary| NULL|
+---------+-----------+----------+
| 300| Mike| 80|
+---------+-----------+----------+
| 400| Jerry| NULL|
+---------+-----------+----------+
| 500| Dan| 50|
+---------+-----------+----------+
SELECT name, age FROM person ORDER BY age NULLS LAST;
+---------+-----------+
| name| age|
+---------+-----------+
| John| 30|
+---------+-----------+
| Dan| 50|
+---------+-----------+
| Mike| 80|
+---------+-----------+
| Mary| NULL|
+---------+-----------+
| Jerry| NULL|
+---------+-----------+
SELECT name, age FROM person ORDER BY age DESC NULLS FIRST;
+---------+-----------+
| name| age|
+---------+-----------+
| Mary| NULL|
+---------+-----------+
| Jerry| NULL|
+---------+-----------+
| Mike| 80|
+---------+-----------+
| Dan| 50|
+---------+-----------+
| John| 30|
+---------+-----------+