SQL Serverのクエリでデータを整列させる「ORDER BY」句は、非常に重要な役割を果たします。
このガイドでは、「ORDER BY」の基本的な使い方から、複数列での並び替え、昇順・降順の指定、そしてパフォーマンス最適化のポイントまで詳しく解説します。
最後に演習問題も用意していますので、学習の総仕上げに挑戦してみてください。
ORDER BYの基本構文
ORDER BYは、クエリの結果を指定した列を基準に整列させるSQL文です。構文は以下の通りです:
SELECT 列名
FROM テーブル名
ORDER BY 並び替え基準 [ASC|DESC];
- ASC:昇順(デフォルト設定)
- DESC:降順
例:単一列での並び替え
以下の例では、employeesテーブルのデータをlast_name列を基準に昇順で並び替えます:
SELECT first_name, last_name, salary
FROM employees
ORDER BY last_name;
複数列での並び替え
複数列を指定することで、優先順位を持たせた並び替えが可能です。例えば、department_idで昇順、次にsalaryで降順に並び替える場合:
SELECT first_name, last_name, department_id, salary
FROM employees
ORDER BY department_id ASC, salary DESC;
このように、優先順位に従ったデータ整列ができます。
別名や式を使ったORDER BY
別名を使う
クエリ内で別名(エイリアス)を指定し、それを基準に並び替えることも可能です:
SELECT first_name, last_name, salary * 12 AS annual_salary
FROM employees
ORDER BY annual_salary DESC;
式を使う
直接計算式をORDER BYに記述することもできます:
SELECT first_name, last_name, hire_date
FROM employees
ORDER BY DATEDIFF(DAY, hire_date, GETDATE()) ASC;
NULL値の扱い
SQL Serverでは、NULL値は通常、昇順では最初に、降順では最後に並びます。ただし、NULLS FIRSTやNULLS LASTを直接指定することはできません。そのため、以下のようにCASE文を使ってカスタムの並び替えを実現できます:
SELECT first_name, last_name, salary
FROM employees
ORDER BY CASE WHEN salary IS NULL THEN 1 ELSE 0 END, salary ASC;
ORDER BYのパフォーマンス最適化
大量のデータを並び替えると、パフォーマンスが低下する可能性があります。その対策として以下を考慮しましょう:
インデックスの利用
並び替え対象列に適切なインデックスを作成します。
CREATE INDEX idx_salary ON employees(salary);
ページネーションと組み合わせる
データの一部を取得することで処理負荷を軽減できます。
SELECT first_name, last_name, salary
FROM employees
ORDER BY salary DESC
OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY;
演習問題
問題1:単一列の並び替え
次のクエリを完成させ、products
テーブルのデータをprice
列で昇順に並び替えてください。
SELECT product_id, product_name, price
FROM products
______;
問題2:複数列の並び替え
以下のクエリを完成させ、orders
テーブルのデータをcustomer_id
で昇順、次にorder_date
で降順に並び替えてください。
SELECT order_id, customer_id, order_date
FROM orders
______;
問題3:式を使った並び替え
employees
テーブルの従業員を、入社してからの経過日数が少ない順に並び替えるクエリを完成させてください。
SELECT first_name, last_name, hire_date
FROM employees
______;
解答例
問題1の解答
SELECT product_id, product_name, price
FROM products
ORDER BY price ASC;
問題2の解答
SELECT order_id, customer_id, order_date
FROM orders
ORDER BY customer_id ASC, order_date DESC;
問題3の解答
SELECT first_name, last_name, hire_date
FROM employees
ORDER BY DATEDIFF(DAY, hire_date, GETDATE()) ASC;
まとめ
SQL ServerのORDER BY
は、単純な並び替えから複雑な条件での整列まで幅広く活用できます。
正しく使いこなすことで、より直感的で効率的なクエリを作成できます。
今回の解説を基に、ぜひ演習問題にも挑戦してみてください!