MySQLでORDER BYに指定するカラムが複数ある場合の書き方
MySQLでORDER BY句を使用して、複数のカラムを基準にソートを行うことができます。
複数のカラムでソートする場合、ORDER BY句の後にソートしたいカラムをコンマで区切って指定します。
それぞれのカラムに対して昇順(ASC)や降順(DESC)を個別に指定することも可能です。
基本的な構文は以下のようになります。
SELECT カラム1, カラム2, ... FROM テーブル名 ORDER BY カラムA [ASC|DESC], カラムB [ASC|DESC], ...;
この構文では、最初に指定したカラムカラムAでソートを行い、同じ値の行については次に指定したカラムBでソートが行われます。
それ以降も同様に、複数のカラムでソートを続けることができます。
複数のカラムでソートする例
次に、employeesという従業員データを持つテーブルがあり、そのテーブルに以下のようなデータが格納されているとします。
id | last_name | first_name | salary |
----- | ----------- | ------------ | -------- |
1 | Smith | John | 5000 |
2 | Doe | Jane | 4500 |
3 | Smith | Anna | 5500 |
4 | Brown | Charlie | 5000 |
このテーブルから従業員を「last_name(姓)」でソートし、同じ姓の従業員については「salary(給与)」でソートしたいと考えた場合、次のようにORDER BY句を使います。
SELECT id, last_name, first_name, salary FROM employees ORDER BY last_name ASC, salary DESC;
このクエリの結果は次のようになります。
id | last_name | first_name | salary |
----- | ----------- | ------------ | -------- |
4 | Brown | Charlie | 5000 |
2 | Doe | Jane | 4500 |
3 | Smith | Anna | 5500 |
1 | Smith | John | 5000 |
この場合、まずlast_nameの昇順(ASC)で並び替えられています。
Smithという同じ姓の従業員が2名いるため、その中でsalary(給与)の降順(DESC)でさらに並び替えが行われています。
Anna Smithの給与がJohn Smithよりも高いため、Annaが先に表示されています。
昇順と降順の組み合わせ
ORDER BY句では、各カラムに対して昇順(ASC)や降順(DESC)を個別に指定することができます。
例えば、last_nameでは昇順、salaryでは降順のように、カラムごとに異なる並び順を指定することが可能です。
上記の例ではlast_nameはASCで、salaryはDESCに設定していますが、これを逆にして、last_nameを降順、salaryを昇順に設定することもできます。
SELECT id, last_name, first_name, salary FROM employees ORDER BY last_name DESC, salary ASC;
このクエリの結果は次のようになります。
id | last_name | first_name | salary |
----- | ----------- | ------------ | -------- |
3 | Smith | Anna | 5500 |
1 | Smith | John | 5000 |
2 | Doe | Jane | 4500 |
4 | Brown | Charlie | 5000 |
今度はlast_nameが降順(DESC)で並び替えられ、Smithが最初に来ています。
同じSmith姓の中では、salaryの昇順(ASC)でさらに並び替えられ、給与の低いJohnが後に表示されています。
NULL値の扱い
MySQLでは、ORDER BY句を使ってソートを行う際に、NULL値が含まれている場合、NULL値は通常、昇順では先頭に、降順では末尾に配置されます。
しかし、MySQL 8.0以降では、ORDER BY句にNULLS FIRSTやNULLS LASTを明示的に指定して、NULL値の扱いを変更することができます。
SELECT id, last_name, first_name, salary FROM employees ORDER BY salary ASC NULLS LAST;
このクエリでは、salaryがNULLの従業員はリストの最後に配置されます。
パフォーマンスの注意点
ORDER BY句を使用するとき、特に複数のカラムでソートする場合は、インデックスの設定が重要になるケースがあります。
適切なインデックスがない場合、ソートに時間がかかることがあります。
例えば、last_nameとsalaryに対してインデックスを作成することで、ソートのパフォーマンスが向上する可能性があります。
CREATE INDEX idx_lastname_salary ON employees (last_name, salary);
これにより、last_nameとsalaryを基準としたソートが効率的に行えるようになります。
複数カラムのソートは、データベースクエリの結果を整理するために便利な機能です。
適切にORDER BY句を使うことで、ユーザーにとって見やすく、かつ効率的なデータ取得が可能になります。