「給料が高い順に乗員を並べたい」「上位3人だけ見たい」——これまでのWHEREだけで実現できるでしょうか?
WHEREは「行を選ぶ」道具でした。でも「選んだ行をどんな順番で見せるか」は、また別の話です。少し考えてから読み進めてください。
昇順・降順で並べ替えるORDER BY
行の並び順を指定するには、ORDER BY句を使います。
SELECT 列名
FROM テーブル名
ORDER BY 並べ替えの基準列 [ASC | DESC];
ASC― 昇順(小さい順・省略時のデフォルト)DESC― 降順(大きい順)
crewテーブルで、給料が高い順に並べてみましょう。
crew テーブル:
| id | name | role | age | home | salary |
|---|---|---|---|---|---|
| 1 | ユミ | エンジニア | 24 | 地球 | 320000 |
| 2 | ケンジ | パイロット | 35 | 火星 | 400000 |
| 3 | サクラ | 医師 | 41 | 地球 | 520000 |
| 4 | ハルト | 医師 | 33 | 月 | 450000 |
| 5 | レイ | 研究員 | 29 | 火星 | 380000 |
| 6 | ミドリ | パイロット | 27 | 地球 | 360000 |
| 7 | ソラ | エンジニア | 45 | 月 | 470000 |
| 8 | トウマ | 研究員 | 24 | NULL | 270000 |
| 9 | アカリ | エンジニア | 31 | 火星 | 350000 |
| 10 | リョウ | パイロット | 38 | NULL | 440000 |
SELECT name, salary
FROM crew
ORDER BY salary DESC;
結果:
| name | salary |
|---|---|
| サクラ | 520000 |
| ソラ | 470000 |
| ハルト | 450000 |
| リョウ | 440000 |
| ケンジ | 400000 |
| レイ | 380000 |
| ミドリ | 360000 |
| アカリ | 350000 |
| ユミ | 320000 |
| トウマ | 270000 |
DESCを書かなければ、ASC(昇順)が使われます。給料が低い順に見たいなら、ORDER BY salary(またはORDER BY salary ASC)と書くだけです。
複数キーでの並べ替え
「まず役割ごとにまとめて、その中では年齢が高い順」のように、複数の基準で並べたいときは、カンマ区切りで列を並べます。
SELECT name, role, age
FROM crew
ORDER BY role, age DESC;
結果:
| name | role | age |
|---|---|---|
| ソラ | エンジニア | 45 |
| アカリ | エンジニア | 31 |
| ユミ | エンジニア | 24 |
| リョウ | パイロット | 38 |
| ケンジ | パイロット | 35 |
| ミドリ | パイロット | 27 |
| サクラ | 医師 | 41 |
| ハルト | 医師 | 33 |
| レイ | 研究員 | 29 |
| トウマ | 研究員 | 24 |
最初に書いたroleが最優先の基準になります。そのうえで、roleが同じ行同士は、次に書いたage DESC(年齢の降順)で並べ替えられます。先に書いた列ほど優先度が高いという点を覚えておきましょう。
LIMITで上位N件を取得する
並べ替えたあと、「上位だけ欲しい」という場面はとても多いです。そこで使うのがLIMIT句です。
SELECT name, salary
FROM crew
ORDER BY salary DESC
LIMIT 3;
結果:
| name | salary |
|---|---|
| サクラ | 520000 |
| ソラ | 470000 |
| ハルト | 450000 |
給料が高い順に並べたうえで、先頭の3件だけを取り出しています。「ランキングの上位N件」を出したいときの定番の書き方です。
句の順序
ここまで登場したSELECT・FROM・WHERE・ORDER BY・LIMITには、書く順序が決まっています。
SELECT 列名
FROM テーブル名
WHERE 条件
ORDER BY 並べ替えの基準
LIMIT 件数;
医師を除いた乗員の中で、給料が高い順に3人を出す例です。
SELECT name, role, salary
FROM crew
WHERE role != '医師'
ORDER BY salary DESC
LIMIT 3;
結果:
| name | role | salary |
|---|---|---|
| ソラ | エンジニア | 470000 |
| リョウ | パイロット | 440000 |
| ケンジ | パイロット | 400000 |
この順序(SELECT→FROM→WHERE→ORDER BY→LIMIT)を入れ替えて書くと、SQLは構文エラーになります。慣れるまでは、「まず絞り込み(WHERE)、次に並べ替え(ORDER BY)、最後に件数を絞る(LIMIT)」という流れで覚えておくと迷いません。
「サクラを除いた乗員のうち、年齢が若い順に2人」を取得するSQLとして正しいのは、次のうちどちらでしょう?
SELECT name FROM crew LIMIT 2 WHERE name != 'サクラ' ORDER BY age; か
SELECT name FROM crew WHERE name != 'サクラ' ORDER BY age LIMIT 2;
答えを見る
正解はSELECT name FROM crew WHERE name != 'サクラ' ORDER BY age LIMIT 2;です。SQLは「SELECT→FROM→WHERE→ORDER BY→LIMIT」の順に書く必要があります。LIMITをWHEREより前に書いてしまうと構文エラーになります。
これでSTAGE 03「絞り込みと並べ替え」は完了です。次のSTAGE 04からは、行をグループにまとめて集計する方法を学んでいきます。
/sql/game/ の SQL DIVER で、ORDER BYとLIMITの組み合わせを何度もタイプして体になじませておきましょう。
並べ替えと上位N件、これで「見せ方」を自在にコントロールできるようになったね。句の順序(SELECT→FROM→WHERE→ORDER BY→LIMIT)だけ、しっかり体に入れておこう!