本文介紹ORDER BY子句以及使用方式。

可選的ORDERBY子句具有以下形式:

ORDER BY expression [ ASC | DESC ] [, ...]

expression 可以是輸出列的名稱或序號(SELECT 列表項),也可以是由輸入列值組成的任意表達式。

ORDER BY 子句使結果行根據指定的表達式進行排序。根據最左邊的表達式,如果兩行相等,則根據下一個表達式對它們進行比較,以此類推。如果根據所有指定的表達式,它們是相等的,則它們將以依賴于實現的順序返回。

序號指的是結果列的序號(從左到右)位置。該特性使得能夠基于沒有唯一名稱的列定義排序。這不是必要的,因為始終可以使用 AS 子句向結果列分配名稱。

也可以在 ORDERBY 子句中使用任意表達式,包括未出現在 SELECT 結果列表中的列。因此,以下語句是有效的:

SELECT ename FROM emp ORDER BY empno;

此特性的限制是,應用于 UNIONINTERSECTMINUS 子句結果的 ORDER BY 子句只能指定輸出列名稱或列號,而不能指定表達式。

如果 ORDER BY 表達式是與結果列名稱和輸入列名稱都匹配的簡單名稱,則 ORDER BY 會將其解釋為結果列名稱。這與 GROUP BY 在相同情況下的選擇相反。這種不一致旨在符合 SQL 標準。

用戶可以選擇在 ORDER BY 子句中的任何表達式之后添加關鍵字 ASC(升序)或 DESC(降序)。如果未指定,則默認使用 ASC。

Null 值的排序高于任何其他值。換句話說,對于升序排序順序,null 值排在末尾,而對于降序排序順序,null 值排在開頭。

字符串數據根據初始化數據庫集群時建立的特定于區域設置的排序規則順序進行排序。

示例

以下兩個示例是根據第二列 (dname) 的內容對各個結果進行排序的相同方法:

SELECT * FROM dept ORDER BY dname;

 deptno |   dname    |   loc
--------+------------+----------
     10 | ACCOUNTING | NEW YORK
     40 | OPERATIONS | BOSTON
     20 | RESEARCH   | DALLAS
     30 | SALES      | CHICAGO
(4 rows)

SELECT * FROM dept ORDER BY 2;

 deptno |   dname    |   loc
--------+------------+----------
     10 | ACCOUNTING | NEW YORK
     40 | OPERATIONS | BOSTON
     20 | RESEARCH   | DALLAS
     30 | SALES      | CHICAGO
(4 rows)