🔖

【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   |
+---------+-----------+-------+

このデータを使って、昇順・降順・複数カラムによる並び替えの例を紹介します。

1. ORDER BY の基本構文

SELECT カラム名
FROM テーブル名
ORDER BY 並べたいカラム名 ASC|DESC;
  • ASC:昇順(小さい→大きい、あ→ん、A→Z)※省略可能(デフォルト)
  • DESC:降順(大きい→小さい、ん→あ、Z→A)

2. 昇順で並べる(ASC

SELECT name, price
FROM products
ORDER BY price ASC;

このクエリを実行すると、以下のように、価格の昇順で並び替えられます。

実行結果:

+--------+-------+
| name   | price |
+--------+-------+
| Orange | 80    |
| Carrot | 90    |
| Banana | 100   |
| Tomato | 110   |
| Apple  | 120   |
+--------+-------+

3. 降順で並べる(DESC

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