MySQLで取得データを並び替えるソート方法!(ORDER BY)

MySQL MySQL

MySQLでSELECTを使って、取得したデータを並び替える(ソート)方法について書いています。
取得したデータを並び替えるときには、ORDER BYを使います。

ORDER BYを使うと、デフォルトでは昇順(ASC)に並びます。
降順に並びたいときには「DESC」をつけると良いです。

この記事では、最初に使い方を解説した後に、サンプルSQLを試して挙動を確認しています。
MySQLのバージョン8.0.32で、動作を検証しています。

行のソートについては、公式ページのこちらに記事があります。

ORDER BYの使い方

ORDER BYはSELECT文を使うときに、FROMでテーブル名を指定した後に使います。
ORDER BYを書いた後に、並び替え対象にしたいカラム名を記載します。

例えば、下記のように使用します。

SELECT * FROM fruits ORDER BY price;

こうすると、fruitsテーブルのpriceカラムの値の昇順に、データの行が並んで返ってきます。
降順に並べたいときには、カラム名の後に「DESC」を使います。

SELECT * FROM fruits ORDER BY price DESC;

これで、priceカラムの降順にデータが並ぶようになります。

昇順(ASC)を明示的に指定する

ORDER BYはデフォルトで昇順でしたが、昇順は下記のように明示的に書くこともできます。

SELECT * FROM fruits ORDER BY price ASC;

数値は大きい・小さい順

数値はデフォルト(ASC)だと、小さい順に並びます。
DESCを指定すると、大きい順に並びます。

英字はアルファベット順

英字の文字列の場合は、デフォルト(ASC)だとA〜Zの小さい順に並びます。
DESCを指定すると、Z〜Aの順に並びます。

ひらがなは五十音順

ひらがなは50順に並びます。
デフォルトで「あいうえお..」と並んで、DESCにすると逆順に並びます。

ORDER BYを使ったサンプルSQL5つ

下記に示すテストデータを使って、実際にORDER BYの挙動を確認してみます。

テストデータ

今回使っているテーブルと、テストデータは下記になります。

CREATE TABLE fruits (
  id BIGINT NOT NULL AUTO_INCREMENT,
  name VARCHAR(256),
  color VARCHAR(256),
  price INT,
  PRIMARY KEY (id)
);
id name color price
1 りんご red 100
2 ぶどう blue 120
3 みかん orange 130
4 バナナ yellow 110
5 もも pink 125
6 レモン yellow 120

昇順に並べてみる

先ほどのSQLを実際に実行して、priceカラムを対象にして並べてみます。

SELECT * FROM fruits ORDER BY price;

または、下記のようにSQLを書くのも同じです。

SELECT * FROM fruits ORDER BY price ASC;

実際に実行すると、下記のように表示されました。

mysql> SELECT * FROM fruits ORDER BY price;
+----+-----------+--------+-------+
| id | name      | color  | price |
+----+-----------+--------+-------+
|  1 | りんご    | red    |   100 |
|  4 | バナナ    | yellow |   110 |
|  2 | ぶどう    | blue   |   120 |
|  6 | レモン    | yellow |   120 |
|  5 | もも      | pink   |   125 |
|  3 | みかん    | orange |   130 |
+----+-----------+--------+-------+
6 rows in set (0.00 sec)

priceカラムの昇順にデータが並んで返ってきました。

降順に並べてみる

同様にして、priceカラムの降順に並べてみます。

SELECT * FROM fruits ORDER BY price DESC;

ORDER BYの後に、priceカラムを指定して「DESC」を指定しただけです。
これでpriceカラムの降順にデータが並んでくれます。

実際に実行すると、下記のように表示されました。

mysql> SELECT * FROM fruits ORDER BY price DESC;
+----+-----------+--------+-------+
| id | name      | color  | price |
+----+-----------+--------+-------+
|  3 | みかん    | orange |   130 |
|  5 | もも      | pink   |   125 |
|  2 | ぶどう    | blue   |   120 |
|  6 | レモン    | yellow |   120 |
|  4 | バナナ    | yellow |   110 |
|  1 | りんご    | red    |   100 |
+----+-----------+--------+-------+
6 rows in set (0.00 sec)

このように、priceカラムの降順にデータが並んで返ってきました。

複数のカラムで並べる

複数のカラムで、並べることもできます。
例えば、下記のようにカラムを指定することができます。

SELECT * FROM fruits ORDER BY price DESC, id DESC;

ORDER BYの後に、先に指定したものから優先して、カラムの並び順が決まります。
こうすると、priceの降順に並んだ後に、idの降順にデータが並びます。

実際に実行すると、下記のように表示されました。

mysql> SELECT * FROM fruits ORDER BY price DESC, id DESC;
+----+-----------+--------+-------+
| id | name      | color  | price |
+----+-----------+--------+-------+
|  3 | みかん    | orange |   130 |
|  5 | もも      | pink   |   125 |
|  6 | レモン    | yellow |   120 |
|  2 | ぶどう    | blue   |   120 |
|  4 | バナナ    | yellow |   110 |
|  1 | りんご    | red    |   100 |
+----+-----------+--------+-------+
6 rows in set (0.00 sec)

このように、priceカラムの降順に並んだ後に、idカラムの降順に並びました。
priceカラムが優先なので、priceカラムで、まず並びます。

priceの「120」の行に注目すると、idの降順を指定しているので、idの降順に「6, 2」と並びました。

もし「ORDER BY price DESC, id ASC」と指定したとします。
ASCなので、idの昇順になって、priceが「120」のデータ行の2行の並びは「2, 6」となります。

このように、複数のカラムを指定して、並び順を変えることができます。

LIMITを一緒に使う

LIMITはSQLで取得できる結果から、指定した行数を取得します。

ORDER BYと使うときには、ORDER BYの後ろに書きます。
例えば、下記のようにLIMITを指定することができます。

SELECT * FROM fruits ORDER BY price LIMIT 3;

こうすると、priceカラムの昇順に並べた結果の3行が返ってきます。
実際に実行すると、下記のように返ってくることが確認できました。

mysql> SELECT * FROM fruits ORDER BY price LIMIT 3;
+----+-----------+--------+-------+
| id | name      | color  | price |
+----+-----------+--------+-------+
|  1 | りんご    | red    |   100 |
|  4 | バナナ    | yellow |   110 |
|  2 | ぶどう    | blue   |   120 |
+----+-----------+--------+-------+
3 rows in set (0.00 sec)

NULLのカラムは先に表示される

並べる対象の行にNULLが設定されているときには、先に表示されてしまいます。
例えば、priceカラムにNULLが設定されていたときです。

priceカラムを対象にして、昇順で並べると、下記のようになります。

mysql> SELECT * FROM fruits ORDER BY price;
+----+-----------+--------+-------+
| id | name      | color  | price |
+----+-----------+--------+-------+
|  3 | みかん    | orange |  NULL |
|  5 | もも      | pink   |  NULL |
|  1 | りんご    | red    |   100 |
|  4 | バナナ    | yellow |   110 |
|  2 | ぶどう    | blue   |   120 |
|  6 | レモン    | yellow |   120 |
+----+-----------+--------+-------+
6 rows in set (0.00 sec)

NULLカラムを後に表示したいときには、IS NULL ASCをカラム名の後に追記します。

mysql> SELECT * FROM fruits ORDER BY price IS NULL ASC;
+----+-----------+--------+-------+
| id | name      | color  | price |
+----+-----------+--------+-------+
|  1 | りんご    | red    |   100 |
|  2 | ぶどう    | blue   |   120 |
|  4 | バナナ    | yellow |   110 |
|  6 | レモン    | yellow |   120 |
|  3 | みかん    | orange |  NULL |
|  5 | もも      | pink   |  NULL |
+----+-----------+--------+-------+

並び替える方法についてまとめ

今回は、MySQLで取得データを並び替える方法についてまとめました。
記事の内容をまとめると、下記のようになります。

・ORDER BYを使うと、取得したカラムを並び替えることができる。
・デフォルトでは昇順(ASC)で並ぶ。明示的にASCをつけることもできる。
・降順に並べたいときにはDESCを使う。
・複数のカラムを並べるときは、優先順位の高い順にカンマで区切って指定する。
・NULLが入っているときには、NULLの行が優先される。
・NULLの行を後にしたいときには、IS NULL ASCを指定する。

コメント

タイトルとURLをコピーしました