PostgreSQL 入門

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_idfirst_namelast_namesalary
1JohnDoe60000
2JaneSmith75000
3DavidJohnson50000
4AliceBrown80000

salary(給与)の昇順で従業員をソートするには、次のクエリを使用します。

SELECT employee_id, first_name, last_name, salary
FROM employees
ORDER BY salary ASC;

結果は以下の通りです。

employee_idfirst_namelast_namesalary
3DavidJohnson50000
1JohnDoe60000
2JaneSmith75000
4AliceBrown80000

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_idfirst_namelast_namesalary
4AliceBrown80000
2JaneSmith75000
1JohnDoe60000
3DavidJohnson50000

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_idfirst_namelast_namesalary
4AliceBrown80000
1JohnDoe60000
3DavidJohnson50000
5MichaelJohnson55000
2JaneSmith75000

結果は以下の通りです。

employee_idfirst_namelast_namesalary
4AliceBrown80000
1JohnDoe60000
3DavidJohnson50000
5MichaelJohnson55000
2JaneSmith75000

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_idfirst_namelast_namesalary
4AliceBrown80000
1JohnDoe60000
5MichaelJohnson55000
3DavidJohnson50000
2JaneSmith75000

ここではまず、従業員が 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_idfirst_namelast_namesalary
1JohnDoe60000
2JaneSmith75000
3DavidJohnson50000
4AliceBrown80000
6BobWilsonNULL

給与の昇順でソートした場合:

SELECT employee_id, first_name, last_name, salary
FROM employees
ORDER BY salary ASC;

結果は以下のようになり、NULL 値が最後に表示されます。

employee_idfirst_namelast_namesalary
3DavidJohnson50000
1JohnDoe60000
2JaneSmith75000
4AliceBrown80000
6BobWilsonNULL

この挙動を変更し、NULL 値を最初に表示させたい場合は、NULLS FIRST オプションを使用します。

SELECT employee_id, first_name, last_name, salary
FROM employees
ORDER BY salary ASC NULLS FIRST;

結果は以下の通りです。

employee_idfirst_namelast_namesalary
6BobWilsonNULL
3DavidJohnson50000
1JohnDoe60000
2JaneSmith75000
4AliceBrown80000

同様に、降順ソート時に NULL 値を最後に表示させたい場合は NULLS LAST オプションを使用します(これは降順時のデフォルトの挙動でもあります)。

SELECT employee_id, first_name, last_name, salary
FROM employees
ORDER BY salary DESC NULLS LAST;

結果は以下の通りです。

employee_idfirst_namelast_namesalary
4AliceBrown80000
2JaneSmith75000
1JohnDoe60000
3DavidJohnson50000
6BobWilsonNULL

降順ソート時に NULL 値を最初に表示させたい場合:

SELECT employee_id, first_name, last_name, salary
FROM employees
ORDER BY salary DESC NULLS FIRST;

結果は以下の通りです。

employee_idfirst_namelast_namesalary
6BobWilsonNULL
4AliceBrown80000
2JaneSmith75000
1JohnDoe60000
3DavidJohnson50000