SELECT: ORDER BY¶
说明¶
对查询结果进行排序
参数¶
expr
用于排序的表达式,通常是一个字段名,但也可以是一个复杂的表达式。
position
基于查询列表中的表达式位置序号指定排序键,位置序号必须为整数。
c_alias
基于查询列表中的表达式别名指定排序键。
ASC | DESC | USING operator
- ASC指定进行升序排序。
- DESC指定进行降序排序。
- operator指定用于进行排序的操作符,指定"<"相当于进行升序排序,指定">"相当于进行降序排序。
默认为ASC升序
NULLS FIRST|LAST
- NULLS FIRST:如果Order by 中指定了表达式Nulls first则表示null值的记录将排在最前(不管是asc 还是 desc)。
- NULLS LAST:如果Order by 中指定了表达式Nulls last则表示null值的记录将排在最后(不管是asc 还是 desc)。
默认为NULLS LAST
注解
ORDER BY子句
ORDER BY子句将输入进行排序。对于形如ORDER BY expr1, expr2, ...,expr n的ORDER BY子句,可以认为系统将按如下步骤进行排序:
- 对所有输入按expr1进行排序;
对步骤1的输出中expr1相等的行,按expr2进行排序;
...
n. 对步骤n-1的输出中expr1, expr2, ..., expr n-1都相等的行,按expr n进行排序。
ORDER BY子句中的每个表达式通常为字段名,如:
SELECT SNO, SNAME FROM STUDENT ORDER BY SNO;
将所有学生按学号进行排序;若该字段也在SELECT子句中,也可以使用字段在SELECT子句中位置来代替,如上述的查询等价于:
SELECT SNO, SNAME FROM STUDENT ORDER BY 1;
在缺省情况下,ORDER BY子句将按每个排序字段进行升序排序(使用ASC关键字也是进行升序排序,这与缺省情况是等价的),通过使用DESC关键字,可以指定对某字段进行降序排序。用户还可以使用USING关键字指定用于排序的操作,指定USING <相当于进行升序排序,指定USING >相当于进行降序排序。
如果 Order by 中不指定表达式Nulls first和Nulls last 则降序null值排在最前升序null值排在最后(NULL 为最大)
与GROUP BY子句相同,在ORDER BY子句中出现的表达式个数也不能超过128。
示例¶
示例1: 对查询结果进行排序
-- 清理环境
DROP TABLE tab1 CASCADE;
-- 创建表并插入数据
CREATE TABLE tab1 (a INT, b INT, c INT);
INSERT INTO tab1 VALUES(1, 10, 900);
INSERT INTO tab1 VALUES(2, 20, 500);
INSERT INTO tab1 VALUES(2, NULL, 200);
INSERT INTO tab1 VALUES(3, 30, 1000);
SELECT * FROM tab1 ORDER BY a, b, c;
A(int) |B(int) |C(int) |
------------------------------------
1 |10 |900 |
------------------------------------
2 |20 |500 |
------------------------------------
2 |null |200 |
------------------------------------
3 |30 |1000 |
总数目:4
-- 单排序键
SELECT * FROM tab1 ORDER BY c;
A(int) |B(int) |C(int) |
------------------------------------
2 |null |200 |
------------------------------------
2 |20 |500 |
------------------------------------
1 |10 |900 |
------------------------------------
3 |30 |1000 |
总数目:4
-- 多排序键
SELECT * FROM tab1 ORDER BY a, c;
A(int) |B(int) |C(int) |
------------------------------------
1 |10 |900 |
------------------------------------
2 |null |200 |
------------------------------------
2 |20 |500 |
------------------------------------
3 |30 |1000 |
总数目:4
-- 升序排列
SELECT * FROM tab1 ORDER BY c ASC;
A(int) |B(int) |C(int) |
------------------------------------
2 |null |200 |
------------------------------------
2 |20 |500 |
------------------------------------
1 |10 |900 |
------------------------------------
3 |30 |1000 |
总数目:4
-- 降序排列
SELECT * FROM tab1 ORDER BY c DESC;
A(int) |B(int) |C(int) |
------------------------------------
3 |30 |1000 |
------------------------------------
1 |10 |900 |
------------------------------------
2 |20 |500 |
------------------------------------
2 |null |200 |
总数目:4
-- 使用 NULLS FIRST 为 NULL 值排序
SELECT * FROM tab1 ORDER BY a, b NULLS FIRST;
A(int) |B(int) |C(int) |
------------------------------------
1 |10 |900 |
------------------------------------
2 |null |200 |
------------------------------------
2 |20 |500 |
------------------------------------
3 |30 |1000 |
总数目:4
-- 使用 NULLS LAST 为 NULL 值排序
SELECT * FROM tab1 ORDER BY a, b NULLS LAST;
A(int) |B(int) |C(int) |
------------------------------------
1 |10 |900 |
------------------------------------
2 |20 |500 |
------------------------------------
2 |null |200 |
------------------------------------
3 |30 |1000 |
总数目:4
-- 多排序键使用 NULLS FIRST / NULLS LAST
SELECT * FROM tab1 ORDER BY b NULLS FIRST, a, c NULLS LAST;
A(int) |B(int) |C(int) |
------------------------------------
2 |null |200 |
------------------------------------
1 |10 |900 |
------------------------------------
2 |20 |500 |
------------------------------------
3 |30 |1000 |
总数目:4
-- 使用表达式排序
SELECT * FROM tab1 ORDER BY a + b + c;
A(int) |B(int) |C(int) |
------------------------------------
2 |20 |500 |
------------------------------------
1 |10 |900 |
------------------------------------
3 |30 |1000 |
------------------------------------
2 |null |200 |
总数目:4
-- 删除表
DROP TABLE tab1;