SQL ORDER BY句
データのソート(並び替え)は、データベースのクエリにおいて極めて重要な要素です。情報を意味のある、理解しやすい順序で提示することが可能になります。SQLの ORDER BY 句はこの機能を提供し、一つまたは複数のカラムに基づき、結果セットを昇順(アセンディング)または降順(ディセンディング)で並び替えることができます。本章では、ORDER BY 句の構文(シンタックス)、異なるデータ型での使用方法、および具体的な実践例について詳しく解説します。
1. ORDER BY 句の理解
ORDER BY 句は、SELECT 文の結果セットを並び替えるために使用されます。デフォルトでは、行は昇順でソートされます。降順でソートする必要がある場合は、DESC キーワードを使用します。
1.1 基本構文
ORDER BY 句の基本構文は以下の通りです。
SELECT column1, column2, ...
FROM table_name
ORDER BY column1 [ASC | DESC], column2 [ASC | DESC], ...;- SELECT column1, column2, ...: 取得したいカラムを指定します。
- FROM table_name: データを取得するテーブルを指定します。
- ORDER BY column1, column2, ...: ソートの基準となる一つまたは複数のカラムを指定します。
- ASC: 昇順ソートを指定します(デフォルト値)。
- DESC: 降順ソートを指定します。
2. 昇順ソート (ASC)
昇順ソートは、データを最小値から最大値へと並べます。数値カラムの場合は小さい順、テキストカラムの場合はアルファベット順(AからZ)、日付カラムの場合は古い順から新しい順になります。
例:
以下のようなデータを持つ employees(従業員)テーブルがあると仮定します。
| employee_id | first_name | last_name | salary |
|---|---|---|---|
| 1 | John | Doe | 60000 |
| 2 | Jane | Smith | 75000 |
| 3 | David | Johnson | 50000 |
| 4 | Alice | Brown | 80000 |
salary(給与)の昇順で従業員をソートするには、次のクエリを使用します。
SELECT employee_id, first_name, last_name, salary
FROM employees
ORDER BY salary ASC;結果は以下の通りです。
| employee_id | first_name | last_name | salary |
|---|---|---|---|
| 3 | David | Johnson | 50000 |
| 1 | John | Doe | 60000 |
| 2 | Jane | Smith | 75000 |
| 4 | Alice | Brown | 80000 |
ASC はデフォルト設定であるため、省略することも可能です。
SELECT employee_id, first_name, last_name, salary
FROM employees
ORDER BY salary;このクエリは前の例と全く同じ結果を返します。
3. 降順ソート (DESC)
降順ソートは、データを最大値から最小値へと並べます。数値カラムの場合は大きい順、テキストカラムの場合はアルファベットの逆順(ZからA)、日付カラムの場合は新しい順から古い順になります。
例:
salary(給与)の降順で従業員をソートするには、次のクエリを使用します。
SELECT employee_id, first_name, last_name, salary
FROM employees
ORDER BY salary DESC;結果は以下の通りです。
| employee_id | first_name | last_name | salary |
|---|---|---|---|
| 4 | Alice | Brown | 80000 |
| 2 | Jane | Smith | 75000 |
| 1 | John | Doe | 60000 |
| 3 | David | Johnson | 50000 |
4. 複数カラムでのソート
複数のカラムに基づいてデータをソートすることもできます。ソート処理は、ORDER BY 句で指定されたカラムの順序に従って実行されます。最初に指定されたカラムが主ソートキー、二番目が次点ソートキーという形になります。
例:
まず last_name(姓)の昇順でソートし、次に first_name(名)の昇順でソートしてみましょう。
SELECT employee_id, first_name, last_name, salary
FROM employees
ORDER BY last_name ASC, first_name ASC;同じ姓を持つ従業員が二人いる場合(Johnsonを二人追加)のデータ例:
| employee_id | first_name | last_name | salary |
|---|---|---|---|
| 4 | Alice | Brown | 80000 |
| 1 | John | Doe | 60000 |
| 3 | David | Johnson | 50000 |
| 5 | Michael | Johnson | 55000 |
| 2 | Jane | Smith | 75000 |
結果は以下の通りです。
| employee_id | first_name | last_name | salary |
|---|---|---|---|
| 4 | Alice | Brown | 80000 |
| 1 | John | Doe | 60000 |
| 3 | David | Johnson | 50000 |
| 5 | Michael | Johnson | 55000 |
| 2 | Jane | Smith | 75000 |
David Johnson と Michael Johnson の並び順は、姓(last_name)が同じであるため、名(first_name)によって決定されています。
また、カラムごとに昇順と降順を混ぜて使用することも可能です。
SELECT employee_id, first_name, last_name, salary
FROM employees
ORDER BY last_name ASC, salary DESC;結果は以下の通りです。
| employee_id | first_name | last_name | salary |
|---|---|---|---|
| 4 | Alice | Brown | 80000 |
| 1 | John | Doe | 60000 |
| 5 | Michael | Johnson | 55000 |
| 3 | David | Johnson | 50000 |
| 2 | Jane | Smith | 75000 |
ここではまず、従業員が last_name(姓)の昇順でソートされます。同じ姓のグループ内では、salary(給与)の降順で並び替えられます(Michaelの給与がDavidより高いため、前に表示されます)。
5. WHERE 句との組み合わせ
ORDER BY 句は通常、WHERE 句と組み合わせて、フィルタリングされたデータのみをソートするために使用されます。SQL文の実行順序では、先にフィルタリングが行われ、その後にソートが実行されます。
例:
給与が 60,000 より大きい従業員を見つけ、その姓を昇順でソートする場合:
SELECT employee_id, first_name, last_name, salary
FROM employees
WHERE salary > 60000
ORDER BY last_name ASC;6. NULL 値の取り扱い
ORDER BY における NULL(ヌル値) の扱いは、データベースシステムによって異なる場合があります。PostgreSQL では、デフォルトで昇順ソート時に NULL 値は他のどの値よりも「大きい」と見なされます。
例:
給与が NULL の新しい従業員を追加してみましょう。
| employee_id | first_name | last_name | salary |
|---|---|---|---|
| 1 | John | Doe | 60000 |
| 2 | Jane | Smith | 75000 |
| 3 | David | Johnson | 50000 |
| 4 | Alice | Brown | 80000 |
| 6 | Bob | Wilson | NULL |
給与の昇順でソートした場合:
SELECT employee_id, first_name, last_name, salary
FROM employees
ORDER BY salary ASC;結果は以下のようになり、NULL 値が最後に表示されます。
| employee_id | first_name | last_name | salary |
|---|---|---|---|
| 3 | David | Johnson | 50000 |
| 1 | John | Doe | 60000 |
| 2 | Jane | Smith | 75000 |
| 4 | Alice | Brown | 80000 |
| 6 | Bob | Wilson | NULL |
この挙動を変更し、NULL 値を最初に表示させたい場合は、NULLS FIRST オプションを使用します。
SELECT employee_id, first_name, last_name, salary
FROM employees
ORDER BY salary ASC NULLS FIRST;結果は以下の通りです。
| employee_id | first_name | last_name | salary |
|---|---|---|---|
| 6 | Bob | Wilson | NULL |
| 3 | David | Johnson | 50000 |
| 1 | John | Doe | 60000 |
| 2 | Jane | Smith | 75000 |
| 4 | Alice | Brown | 80000 |
同様に、降順ソート時に NULL 値を最後に表示させたい場合は NULLS LAST オプションを使用します(これは降順時のデフォルトの挙動でもあります)。
SELECT employee_id, first_name, last_name, salary
FROM employees
ORDER BY salary DESC NULLS LAST;結果は以下の通りです。
| employee_id | first_name | last_name | salary |
|---|---|---|---|
| 4 | Alice | Brown | 80000 |
| 2 | Jane | Smith | 75000 |
| 1 | John | Doe | 60000 |
| 3 | David | Johnson | 50000 |
| 6 | Bob | Wilson | NULL |
降順ソート時に NULL 値を最初に表示させたい場合:
SELECT employee_id, first_name, last_name, salary
FROM employees
ORDER BY salary DESC NULLS FIRST;結果は以下の通りです。
| employee_id | first_name | last_name | salary |
|---|---|---|---|
| 6 | Bob | Wilson | NULL |
| 4 | Alice | Brown | 80000 |
| 2 | Jane | Smith | 75000 |
| 1 | John | Doe | 60000 |
| 3 | David | Johnson | 50000 |