SELECT: ORDER BY

说明

对查询结果进行排序

语法

select_order_by ::=

nulls_option ::=

参数

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子句,可以认为系统将按如下步骤进行排序:

  1. 对所有输入按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;