ORDER BY
| 対応: | SQL-92(1992) |
|---|
取得した結果を指定した列の値で並び替える句です。昇順・降順の指定や複数列によるソートが可能です。
構文
指定した列で昇順に並び替えます(ASCはデフォルトのため省略可能)。
SELECT 列名 FROM テーブル名 ORDER BY 列名 ASC;
指定した列で降順に並び替えます。
SELECT 列名 FROM テーブル名 ORDER BY 列名 DESC;
複数列で並び替えます(列1が同じ値の場合は列2で並び替えます)。
SELECT 列名 FROM テーブル名 ORDER BY 列名1 ASC, 列名2 DESC;
構文一覧
| 構文 | 概要 |
|---|---|
| ORDER BY 列名 | 指定した列を基準に並び替えます。デフォルトは昇順(ASC)です。 |
| ASC | 昇順(小→大、あ→ん、日付の古い順)で並び替えます。省略した場合の既定値です。 |
| DESC | 降順(大→小、ん→あ、日付の新しい順)で並び替えます。 |
| ORDER BY 列1, 列2 | 複数列を指定した場合、列1が同じ値の行を列2でさらに並び替えます。 |
| NULLS FIRST | NULL値を先頭に配置します(PostgreSQLなどで対応)。 |
| NULLS LAST | NULL値を末尾に配置します(PostgreSQLなどで対応)。 |
サンプルコード
以下の『employees』テーブルを例に説明します。
社員を給与の昇順に並び替えます。
sample_order_by.sql
SELECT name, salary FROM employees ORDER BY salary ASC;
+------------+--------+ | name | salary | +------------+--------+ | 椎名まゆり | 260000 | | 橋田至 | 280000 | | 岡部倫太郎 | 320000 | | 牧瀬紅莉栖 | 350000 | +------------+--------+ 4 rows in set
社員を給与の降順に並び替えます(高い順)。
sample_order_by.sql
SELECT name, salary FROM employees ORDER BY salary DESC;
+------------+--------+ | name | salary | +------------+--------+ | 牧瀬紅莉栖 | 350000 | | 岡部倫太郎 | 320000 | | 橋田至 | 280000 | | 椎名まゆり | 260000 | +------------+--------+ 4 rows in set
部署名の昇順に並び替え、同じ部署内は給与の降順にします。
sample_order_by.sql
SELECT name, department, salary FROM employees ORDER BY department ASC, salary DESC;
+------------+----------------------+--------+ | name | department | salary | +------------+----------------------+--------+ | 牧瀬紅莉栖 | 未来ガジェット研究所 | 350000 | | 岡部倫太郎 | 未来ガジェット研究所 | 320000 | | 橋田至 | 未来ガジェット研究所 | 280000 | | 椎名まゆり | 未来ガジェット研究所 | 260000 | +------------+----------------------+--------+ 4 rows in set
入社日が新しい順に並び替えます。
sample_order_by.sql
SELECT name, hire_date FROM employees ORDER BY hire_date DESC;
+------------+------------+ | name | hire_date | +------------+------------+ | 橋田至 | 2022-07-10 | | 椎名まゆり | 2021-04-01 | | 牧瀬紅莉栖 | 2020-09-15 | | 岡部倫太郎 | 2019-06-01 | +------------+------------+ 4 rows in set
SELECT句の列番号(位置)で並び替えることもできます。『3』はSELECTの3番目の列(この例では salary)を指します。
sample_order_by.sql
SELECT name, department, salary FROM employees ORDER BY 3 DESC;
+------------+----------------------+--------+ | name | department | salary | +------------+----------------------+--------+ | 牧瀬紅莉栖 | 未来ガジェット研究所 | 350000 | | 岡部倫太郎 | 未来ガジェット研究所 | 320000 | | 橋田至 | 未来ガジェット研究所 | 280000 | | 椎名まゆり | 未来ガジェット研究所 | 260000 | +------------+----------------------+--------+ 4 rows in set
データベース別の書き方
『ORDER BY』の基本構文(『ASC』・『DESC』・複数列指定)は主要なデータベースで共通して使用できます。
SELECT name, department, salary FROM employees ORDER BY department ASC, salary DESC;
NULLの並び順はデータベースによって異なります。PostgreSQL では『NULLS FIRST』『NULLS LAST』で明示的に制御できます。
-- PostgreSQL SELECT name, salary FROM employees ORDER BY salary ASC NULLS LAST;
MySQLではNULLを末尾にするには『IS NULL』を応用します。
-- MySQL(NULLを末尾に配置) SELECT name, salary FROM employees ORDER BY salary IS NULL ASC, salary ASC;
概要
『ORDER BY』はSELECT文の末尾(WHERE・GROUP BY・HAVINGの後)に記述します。並び替えの基準となる列は複数指定でき、左から順に優先されます。
NULLを含む列を並び替えた場合、MySQLではNULLは最小値として扱われるため昇順で先頭、降順で末尾に配置されます。PostgreSQLでは『NULLS FIRST』・『NULLS LAST』で明示的に制御できます。
取得件数の制限と組み合わせる場合は『LIMIT / OFFSET』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。