MySQLでORDER BYに指定するカラムが複数ある場合の書き方

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句を使うことで、ユーザーにとって見やすく、かつ効率的なデータ取得が可能になります。