ORDER BY句とは?基本構文と役割
ORDER BY句は、SQLでデータベースから取得したデータを特定の順序で並び替えるための重要な機能です。
例えば、「従業員データを年齢順に表示したい」ときや「商品データを価格の安い順に並べたい」といった場面で使います。
データベースから情報を取得する際、通常はランダムな順序で表示されます。しかし、ORDER BYを使用することで、数値の大小順や文字列のあいうえお順など、目的に応じた並び順でデータを表示することができます。
ORDER BY句の特徴を見てみましょう。
ORDER BY句の特徴
- 指定した順序でデータを並び替えることができる
- 数値の大小順、文字列のあいうえお順、日付の古い順・新しい順に対応している
- 複数の列を組み合わせた階層的な並び替えもできる
- SELECT文の最後に記述し、取得後のデータに対して並び替え処理を実行する
実際の開発では、データをわかりやすい順序で表示する必要に迫られる場面が多々あります。
そのような場面で、FROM句は必須だといえるでしょう。
ORDER BYの基本構文と書き方
ORDER BY句の基本的な書き方は「SELECT 列名 FROM テーブル名 ORDER BY 並び替えの基準となる列名」です。
SELECT文の最後に記述し、指定した列の値に基づいてデータを並び替えます。何も指定しない場合は昇順(小さい値から大きい値へ)での並び替えになります。
以降の解説では、次の動物管理データベースを例として使用します。
animal_id |
name |
age |
weight |
species |
---|---|---|---|---|
1 |
ライオン |
5 |
180.5 |
肉食動物 |
2 |
ゾウ |
12 |
4500.0 |
草食動物 |
3 |
ペンギン |
3 |
25.2 |
魚食動物 |
4 |
キリン |
8 |
1200.0 |
草食動物 |
5 |
トラ |
4 |
220.0 |
肉食動物 |
例で使用するデータベースを作成したい方は、次のSQLスクリプトを参考にしてください。
実際に使用例を見てみましょう。
出力結果
name |
age |
---|---|
ペンギン |
3 |
トラ |
4 |
ライオン |
5 |
キリン |
8 |
ゾウ |
12 |
※使用するDBMS(データベース管理システム)によって表示結果が異なる場合があります。以後のコードも同様です
ORDER BY ageで年齢(age列)を基準にして動物を並べ替えている例です。結果として、年齢が低い順に動物が表示されています。
このように、ORDER BY句を使うことでデータが見やすい順序で整理されます。
SELECT文との関係
ORDER BY句はSELECT文の一番最後に書くという決まりがあります。
データベースは「FROM(どのテーブルから) → WHERE(どんな条件で絞り込むか) → GROUP BY(どうやってまとめるか) → ORDER BY(どんな順番に並べるか)」という順序で処理します。
ORDER BYは必ず最後に記述し、他の処理が全て終わってから並び替えを行います。
出力結果
name |
weight |
---|---|
ライオン |
180.5 |
トラ |
220.0 |
まずWHERE句で肉食動物だけに絞り込み、その後ORDER BY句で体重順に並び替えています。
結果として、肉食動物の中で体重が軽い順(ライオン、トラ)に表示されています。「条件で絞り込んでから並び替える」という処理の流れが重要なポイントです。
ORDER BYで並び替えが必要なケース例
ORDER BYを使うと便利な場面はたくさんあります。
例えば、
「売上データを金額順に並べて上位商品を確認したい」
「社員データを入社日順に並べて先輩後輩関係を把握したい」
「在庫データを数量順に並べて補充が必要な商品を特定したい」
といった場面です。
データベースから意味のある情報を抽出するためには欠かせない機能だといえます。
出力結果
name |
weight |
---|---|
ゾウ |
4500 |
キリン |
1200 |
トラ |
220 |
ライオン |
180.5 |
ペンギン |
25.2 |
動物を体重の重い順に並べて、最も重い動物を確認している例です。
ORDER BY weight DESCで体重の重い順(降順)に動物を並べ替えています。DESCを付けることで「大きい順」の並び替えができます。
昇順(ASC)と降順(DESC)の違いと使い分け
ORDER BYでデータを並び替える順番には、2つの方向があります。
「昇順(ASC)」は小さい値から大きい値へ、「降順(DESC)」は大きい値から小さい値への並び替えです。
数値なら「1、2、3」の順か「3、2、1」の順かという違いです。
データの用途に応じて使い分けられるようになりましょう。
ASC(昇順)指定の使い方
ASC(Ascending)は「昇順」という意味で、ORDER BYの基本設定です。数値なら1、2、3の順、文字列なら五十音順(あいうえお順)、日付なら古い順に並びます。
実は、ASCと書かなくても自動的に昇順になるため、普通は省略します。「ASCと明記してわかりやすくする」こともできますが、実際の開発では書かないことの方が一般的です。
出力結果
name |
age |
---|---|
キリン |
8 |
ゾウ |
12 |
トラ |
4 |
ペンギン |
3 |
ライオン |
5 |
動物の名前を五十音順(あいうえお順)に並べている例です。
ただし、日本語の並び順については注意が必要です。
厳密にいうと、多くのデータベースでは文字コード順で並ぶため、期待する「あいうえお順」にならない場合があります。
日本語データを正確に五十音順で並べたい場合は、データベースの設定や特別な機能が必要になるという知識だけ頭の片隅に置いておきましょう。
DESC(降順)指定の使い方
DESC(Descending)は「降順」という意味で、大きい値から小さい値へ並び替えます。
DESCは自動では設定されないので、大きい順にしたい場合は必ずDESCと書く必要があります。
ランキングを作りたいときや、最新のデータからたどって見たいときに有用です。
出力結果
name |
age |
---|---|
ゾウ |
12 |
キリン |
8 |
ライオン |
5 |
トラ |
4 |
ペンギン |
3 |
年齢が高い順に表示されているのが確認できるはずです。
数値・文字列・日付で並び順がどう変わるか
データの種類によって、並び順のルールが変わります。
数値の場合は数学的な大小(1、2、10の順)、文字列の場合は辞書順(あいうえお順)、日付の場合は時間の流れ(古い順から新しい順)で並びます。
注意が必要なのは、数字でも文字列として保存されている場合です。文字列の「1」「2」「10」は、「1」「10」「2」の順に並んでしまうからです。
ORDER BYとGROUP BYの混同に注意
SQLを学び始めの人が間違えやすいのが、ORDER BYとGROUP BYです。この2つは名前が似ていますが、役割は全く違います。
GROUP BYは「データをまとめて集計する」機能で、ORDER BYは「データを並び替える」機能です。
GROUP BYで集計した結果を、ORDER BYで見やすく並び替えることもできます。「まとめる」と「並べる」は別の作業だと心得ましょう。
また、名前としては「BY」という部分が同じなので混同しやすいですが、「GROUP」と「ORDER」という言葉で区別して覚えましょう。
「GROUP」はまとまっているイメージがあると思うので、消去法的に「ORDER」との意味の違いを分けて覚えられると思います。
GROUP BYとORDER BYの役割の違い
GROUP BYは「同じ種類のデータをまとめて、合計や平均を計算する」機能です。一方、ORDER BYは「すでに取得したデータを、指定した順序で並び替える」機能です。
簡単にいうと、GROUP BYは「計算」、ORDER BYは「整理」の役割です。
例えば、GROUP BYで「各部署の人数を数える」という計算をして、ORDER BYで「人数の多い部署から順に表示する」という整理を行います。
出力結果
species |
count |
---|---|
肉食動物 |
2 |
草食動物 |
2 |
魚食動物 |
1 |
GROUP BYを使って動物の種類ごとに数を集計しています。
COUNT(*)は「数を数える」関数で、各グループに何個のデータがあるかを教えてくれます。
結果として、各種類の動物がどれだけ存在しているかが表示されています。
GROUP BYは「同じ種類の動物をまとめる」、COUNT(*)は「まとめた中で数を数える」という役割分担で集計処理を行います。
ちなみに、次のような集計関数があります。あわせて覚えておきましょう。
- COUNT():件数を数える
- AVG():平均を計算
- SUM():合計を計算
- MAX():最大値を取得
- MIN():最小値を取得
GROUP BYとORDER BYの組み合わせは可能
GROUP BYで集計した結果を、ORDER BYで見やすく並び替えることができます。
例えば「各商品カテゴリの売上合計を計算してから、売上の多い順に表示する」といった処理です。
この場合、GROUP BYを先に書いて集計を行い、その後にORDER BYを書いて並び替えを行います。「まず計算、その後に整理」という順序で処理されます。
出力結果
species |
count |
---|---|
草食動物 |
2 |
肉食動物 |
2 |
魚食動物 |
1 |
GROUP BYで種類(species)別に集計した後、ORDER BYで数の多い順に並べ替えています。
結果として、動物の数が多い種類から順番に表示されています。「まず集計して、その結果を並び替える」という処理の流れがわかるかと思います。
CASE文を併用して条件付き並び替え
ORDER BYにCASE文を組み合わせると、「もし○○なら最初に表示、そうでなければ後で表示」といった条件付きの並び替えができます。
例えば「VIP顧客を最優先で表示したい」ときや「緊急度の高い案件から順に並べたい」といったケースで、単純な大小順序では表現できない独自の並び順を作ることができます。
ビジネスのルールに合わせた柔軟な並び替えを実現する、とても便利な機能です。
CASE文を使ったORDER BYの基本パターン
CASE文とORDER BYの基本的な組み合わせ方は「ORDER BY CASE WHEN 条件 THEN 値 ELSE 値 END」です。
この書き方で、条件に応じて違う優先度を設定できます。
CASE文で指定した数値が小さいほど上位に表示されるので、「重要なものには1、普通のものには2」といった具合に数値を割り当てます。
出力結果
name |
species |
---|---|
トラ |
肉食動物 |
ライオン |
肉食動物 |
キリン |
草食動物 |
ゾウ |
草食動物 |
ペンギン |
魚食動物 |
CASE文を使って肉食動物に「1」、それ以外に「2」という優先度を設定しています。
結果として、肉食動物が最初に表示され、その後に他の動物が表示されています。数値が小さいほど上位に表示されるため、肉食動物が優先的に表示されます。
条件別に優先順位を設定する方法
CASE文で複数の条件を設定して、細かい優先順位を作ることができます。
例えば「緊急度が高い、普通、低い」の3段階で並び替えたい場合、CASE文でそれぞれに「1、2、3」という数値を割り当てればいいのです。
この方法により、「まず緊急度の高いものから表示し、同じ緊急度の中では別の条件で並び替える」といった複雑な並び替えルールであっても簡単に作ることができます。
出力結果
name |
age |
---|---|
ペンギン |
3 |
トラ |
4 |
ライオン |
5 |
キリン |
8 |
ゾウ |
12 |
年齢に応じて3つのグループに分け、それぞれに優先度を設定しています。
結果として、まず若い動物(4歳以下)、次に中年の動物(5~8歳)、最後に高齢の動物(9歳以上)の順で表示されています。
同じグループ内では年齢順に並んでいることも確認できますね。
ORDER BYを複数列で使う方法と注意点
ORDER BYでは複数の列を指定して、「まず○○順に並べて、同じ値の場合は△△順に並べる」という階層的な並び替えができます。
例えば「まず部署別に分けて、同じ部署の中では入社日順に並べる」といった処理です。
これにより、データをより論理的で見やすい順序に整理できます。ただし、列を指定する順序が結果に大きく影響するため、どの順序で指定するかをよく考える必要があります。
複数列でORDER BYを使う基本構文
複数の列で並び替えるときは「ORDER BY 列名1, 列名2, 列名3」のようにカンマで区切って書きます。
最初に書いた列が最も重要な並び替え基準になり、同じ値の場合に次の列で並び替えされます。
例えば「クラス別、その中で出席番号順」にしたい場合、「ORDER BY クラス, 出席番号」と書きます。
左から右へと優先順位が決まるので、どの列を最初に書くかが重要です。
出力結果
name |
species |
age |
---|---|---|
トラ |
肉食動物 |
4 |
ライオン |
肉食動物 |
5 |
キリン |
草食動物 |
8 |
ゾウ |
草食動物 |
12 |
ペンギン |
魚食動物 |
3 |
まずspecies列で種類別に並び替え、同じ種類の中ではage列で年齢順に並び替えています。
結果として、まず種類でグループ分けされ、各グループ内で年齢順に表示されています。「大きな分類→細かい分類」という階層的な並び替えができています。
並び順を列ごとに指定する方法(ASC/DESC混在)
複数の列で並び替えるとき、それぞれの列に対して個別に「昇順(ASC)」か「降順(DESC)」かを指定できます。
例えば「ORDER BY 列名1 DESC, 列名2 ASC」と書くと、最初の列は大きい順、2番目の列は小さい順で並び替えられます。
「売上は多い順に、でも同じ売上なら名前は五十音順に」といった、列ごとに違う並び方を組み合わせることができるというテクニックです。
出力結果
name |
species |
weight |
---|---|---|
トラ |
肉食動物 |
220 |
ライオン |
肉食動物 |
180.5 |
ゾウ |
草食動物 |
4500 |
キリン |
草食動物 |
1200 |
ペンギン |
魚食動物 |
25.2 |
species列は昇順(ASC)、weight列は降順(DESC)で並び替えています。
結果として、種類別にグループ分けされ、各グループ内では体重の重い順に表示されています。
実務での注意点とよくあるミス
複数の列で並び替えるときによくあるミスは、列の順序を間違えることです。
並び替えの優先順位は書いた順番で決まるので、「何を最優先にしたいか」をよく考えて順序を決める必要があります。
また、値が入っていない(NULL)項目がある列で並び替えると、データベースによって表示される位置が変わることがあります。
また、大量のデータを扱う場合は処理に時間がかかることもあるので注意が必要です。
出力結果
name |
age |
species |
---|---|---|
ゾウ |
12 |
草食動物 |
キリン |
8 |
草食動物 |
ライオン |
5 |
肉食動物 |
トラ |
4 |
肉食動物 |
ペンギン |
3 |
魚食動物 |
最初にage列で年齢を降順で並び替え、同じ年齢の場合にspecies列で種類順に並び替えています。
結果として、年齢が最優先の並び替え基準となり、年齢の高い順に表示されています。
今回は全ての動物の年齢が異なるため、年齢順のみで並んでいます。列を指定する順序が少し違うだけで、結果に大きく影響することがあるので注意しましょう。
よくある質問(Q&A)
Q: ORDER BYを使わないとデータはどうなりますか?
A: ORDER BYを指定しない場合、データの表示順序は保証されません。データベースが内部的に効率的と判断した順序で結果が返されるため、実行するたびに異なる順序で表示される可能性があります。一貫した順序が必要な場合は必ずORDER BYを使用してください。
Q: ORDER BYの処理速度を向上させる方法は?
A: ORDER BYの対象となる列にインデックスを作成することで、並び替え処理の速度を大幅に向上させることができます。特に大量のデータを扱う場合は、適切なインデックス設計が重要です。また、不要な列を取得しないことも処理速度向上に効果的です。
Q: 文字列と数値が混在する列での並び替えは?
A: 文字列として保存された数値データは、文字列順(辞書順)で並び替えられるため、期待する結果にならない場合があります。この場合はCAST関数やCONVERT関数を使用して数値型に変換してから並び替えを行う必要があります。
まとめ
ORDER BY句は、データベースから取得したデータを意味のある順序で表示するための重要な機能です。
この記事では、ORDER BY句の基本構文から実用的な応用例まで解説しました。ORDER BY句の活用場面について確認しておきましょう。
ORDER BY句が活躍する場面
- 取得したデータを見やすい順序で表示したいとき
- 売上ランキングや成績順位を作成したいとき
- 複数の条件を組み合わせて、階層的な並び替えを行いたいとき
- 特定の条件に基づいた独自の並び順を作成したいとき
ORDER BY句を使う上で押さえておきたいポイントは次の通りです。
重要なポイント
- ORDER BY句の基本構文とSELECT文での位置関係
- ASC(昇順)とDESC(降順)の特性
- GROUP BYとの違いと組み合わせ方法
- CASE文による条件付き並び替え
- 複数列を指定するときの優先順位
初めてSQLを学ぶ方も、この記事で紹介したORDER BY句の基本的な使い方と実用例を参考に、ぜひ実際にSQL文を書いてみてください。
データベースから情報を自在に並び替えて表示できるスキルは必須スキルです。
ORDER BY句をマスターすれば、ユーザーが求める情報を最適な順序で瞬時に提供でき、直感的で使いやすいシステムを構築することができるようになります。
まずは1つの条件から始めて、徐々に複数の条件で並び替えることにチャレンジしてみてください。
ORDER BY句をマスターして、データを思い通りにコントロールできるようになりましょう。