STAGE 03 — 3-4 / 絞り込みと並べ替え

ORDER BYとLIMIT

考えてみよう

「給料が高い順に乗員を並べたい」「上位3人だけ見たい」——これまでのWHEREだけで実現できるでしょうか?

WHEREは「行を選ぶ」道具でした。でも「選んだ行をどんな順番で見せるか」は、また別の話です。少し考えてから読み進めてください。

昇順・降順で並べ替えるORDER BY

行の並び順を指定するには、ORDER BY句を使います。

SELECT 列名
FROM テーブル名
ORDER BY 並べ替えの基準列 [ASC | DESC];

crewテーブルで、給料が高い順に並べてみましょう。

crew テーブル:

idnameroleagehomesalary
1ユミエンジニア24地球320000
2ケンジパイロット35火星400000
3サクラ医師41地球520000
4ハルト医師33450000
5レイ研究員29火星380000
6ミドリパイロット27地球360000
7ソラエンジニア45470000
8トウマ研究員24NULL270000
9アカリエンジニア31火星350000
10リョウパイロット38NULL440000

SELECT name, salary
FROM crew
ORDER BY salary DESC;

結果:

namesalary
サクラ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;

結果:

nameroleage
ソラエンジニア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;

結果:

namesalary
サクラ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;

結果:

namerolesalary
ソラエンジニア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)だけ、しっかり体に入れておこう!