導入
SELECT で取り出した行は、そのままだと決まった順が保証されません。「価格が安い順」「年齢が高い順」のように並び順を指定したいときは ORDER BY を使います。「上位◯件だけ」に絞るのが LIMIT です。ランキング表示の定番の組み合わせです。
説明
ORDER BY は「どの列を基準に並べるか」を指定します。FROM や WHERE の後ろに書きます。
SELECT name, price FROM products ORDER BY price;
これで価格の昇順(小さい順)に並びます。何も付けないと昇順です。明示するなら ASC(ascending)、逆に降順(大きい順)なら DESC(descending)を付けます。
flowchart LR
subgraph ASC["ORDER BY price ASC(昇順・小さい順)"]
A["800 → 1500 → 3200 → … → 128000"]
end
subgraph DESC["ORDER BY price DESC(降順・大きい順)"]
B["128000 → … → 3200 → 1500 → 800"]
end
並べる基準は複数指定できます。カンマで区切ると、「まず1つ目の列で並べ、同じ値のときは2つ目の列で並べる」という動きになります。
SELECT name, category_id, price FROM products ORDER BY category_id ASC, price DESC;
先頭の数件だけが欲しいときは LIMIT を付けます。「高い順に上位3件」はこう書きます。
SELECT name, price FROM products ORDER BY price DESC LIMIT 3;
LIMIT に OFFSET を足すと、「先頭から数件を飛ばして、その次から」を取れます(ページ送りで使います。4〜6位を出すなら「上位3件を飛ばして次の3件」)。
SELECT name, price FROM products ORDER BY price DESC LIMIT 3 OFFSET 3;
やってみよう
初期表示のクエリを実行して、価格の高い順に商品が並ぶことを確認しましょう。次に DESC を消して(または ASC にして)、並びが逆になることを見てください。
演習
users テーブルから、年齢(age)が高い順に上位3件の name と age を取り出してください。
ヒント1を見る
降順は ORDER BY age DESC、件数制限は LIMIT 3 です。
ヒント2を見る
SELECT name, age FROM users ORDER BY age DESC LIMIT 3;