【SQL】ORDER BYの使い方と並び順(ASC/DESC)の基本を解説
はじめに
SQLでデータを取得する際に、並び順を指定したい場面がよくあります。
そんなときに使うのが ORDER BY
句です。
例えば、「価格の安い順に商品を並べたい」「名前のアルファベット順で並べたい」といった場面で使います。
本記事では、ORDER BY
の基本的な使い方から、昇順(ASC
)・降順(DESC
)の指定方法、複数列でのソート方法などを解説します。
products
テーブルの定義
本記事では以下のような products
テーブルを前提として、ORDER BY
の使い方を解説します。
CREATE TABLE products (
name VARCHAR(100),
category VARCHAR(100),
price INT
);
例として使用するデータ:
+---------+-----------+-------+
| name | category | price |
+---------+-----------+-------+
| Banana | Fruit | 100 |
| Apple | Fruit | 120 |
| Orange | Fruit | 80 |
| Carrot | Vegetable | 90 |
| Tomato | Vegetable | 110 |
+---------+-----------+-------+
このデータを使って、昇順・降順・複数カラムによる並び替えの例を紹介します。
ORDER BY
の基本構文
1. SELECT カラム名
FROM テーブル名
ORDER BY 並べたいカラム名 ASC|DESC;
-
ASC
:昇順(小さい→大きい、あ→ん、A→Z)※省略可能(デフォルト) -
DESC
:降順(大きい→小さい、ん→あ、Z→A)
ASC
)
2. 昇順で並べる(SELECT name, price
FROM products
ORDER BY price ASC;
このクエリを実行すると、以下のように、価格の昇順で並び替えられます。
実行結果:
+--------+-------+
| name | price |
+--------+-------+
| Orange | 80 |
| Carrot | 90 |
| Banana | 100 |
| Tomato | 110 |
| Apple | 120 |
+--------+-------+
DESC
)
3. 降順で並べる(SELECT name, price
FROM products
ORDER BY price DESC;
このクエリを実行すると、以下のように、価格の降順で並び替えられます。
実行結果:
+--------+-------+
| name | price |
+--------+-------+
| Apple | 120 |
| Tomato | 110 |
| Banana | 100 |
| Carrot | 90 |
| Orange | 80 |
+--------+-------+
4. 複数のカラムで並び替える
SELECT name, category, price
FROM products
ORDER BY category ASC, price DESC;
このクエリでは、まず category
を昇順(A→Z)で並び替えたうえで、
同じカテゴリ内では price
を降順で並べています。
実行結果:
+---------+-----------+-------+
| name | category | price |
+---------+-----------+-------+
| Apple | Fruit | 120 |
| Banana | Fruit | 100 |
| Orange | Fruit | 80 |
| Tomato | Vegetable | 110 |
| Carrot | Vegetable | 90 |
+---------+-----------+-------+
5. 列番号で指定する方法(非推奨)
SELECT name, price
FROM products
ORDER BY 2 DESC; -- priceの降順
このクエリを実行すると、以下のように、価格の降順で並び替えられます。
+--------+-------+
| name | price |
+--------+-------+
| Apple | 120 |
| Tomato | 110 |
| Banana | 100 |
| Carrot | 90 |
| Orange | 80 |
+--------+-------+
列番号による指定は可能ですが、可読性が下がるため実務ではあまり使われません。
6. NULLの並び順について(DBによって異なる)
次のようなデータで price
を並び替えると、NULL
の扱いがDBによって異なります。
+--------+-------+
| name | price |
+--------+-------+
| Banana | 100 |
| Apple | NULL |
| Orange | 80 |
+--------+-------+
以下のクエリをMySQLとPostgreSQLで実行した場合、それぞれ結果が異なります。
-- 昇順の場合
SELECT name, price FROM products ORDER BY price ASC;
-- 降順の場合
SELECT name, price FROM products ORDER BY price DESC;
MySQLの並び順
-
ASC
(昇順):NULLは最初 -
DESC
(降順):NULLは最後
-- ASC(昇順) -- DESC(降順)
Apple | NULL Banana | 100
Orange | 80 Orange | 80
Banana | 100 Apple | NULL
PostgreSQLの並び順
-
ASC
(昇順):NULLは最後 -
DESC
(降順):NULLは最初
-- ASC(昇順) -- DESC(降順)
Orange | 80 Apple | NULL
Banana | 100 Banana | 100
Apple | NULL Orange | 80
NULLの位置を制御する方法
MySQLでは IS NULL
を使用します。
-- NULLを最後に表示(昇順)
SELECT name, price FROM products ORDER BY price IS NULL, price ASC;
-- NULLを最初に表示(降順)
SELECT name, price FROM products ORDER BY price IS NULL DESC, price DESC;
PostgreSQLでは NULLS FIRST
/ NULLS LAST
を使用します。
-- NULLを最初に表示
SELECT name, price FROM products ORDER BY price ASC NULLS FIRST;
-- NULLを最後に表示
SELECT name, price FROM products ORDER BY price DESC NULLS LAST;
おわりに
ORDER BY
句は、SQLでデータを見やすく整えるための基本です。
-
ASC
(昇順)は省略可能、DESC
(降順)は明示が必要 - 複数のカラムで並び替えると、柔軟なソートが可能
-
NULL
の扱いにはデータベースごとの違いがあるため注意が必要
こうした基本をしっかり押さえておくと、SQLの見通しが良くなり、バグも防ぎやすくなります。
本記事が参考になれば幸いです。
Discussion