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で取得データを並び替える方法についてまとめました。
記事の内容をまとめると、下記のようになります。
・デフォルトでは昇順(ASC)で並ぶ。明示的にASCをつけることもできる。
・降順に並べたいときにはDESCを使う。
・複数のカラムを並べるときは、優先順位の高い順にカンマで区切って指定する。
・NULLが入っているときには、NULLの行が優先される。
・NULLの行を後にしたいときには、IS NULL ASCを指定する。
コメント