MySQLの昇順ソートでNULLのデータを後ろに持っていく

この記事はだいぶ前に書かれたものなので情報が古いかもしれません
まえへならえ

この記事を三行にまとめると

昇順でソートしつつNULLのデータは後ろに持っていきたい
ORDER BY column IS NULL ASC, column ASC
思ったよりも簡単にできました
MySQLで特定のカラムでソートをする時、NULLを許可しているカラムに対して昇順(ASC)でソートをかけるとNULLのデータが先に来ます。

でも仕様によっては昇順でソートしつつNULLのデータは後ろに持っていきたいという場合もあると思います。

そんな時はどう書くか。結論だけ先に言うとこんな感じのSELECT文を書けば昇順で並び替えつつNULLのデータを後ろに持っていくことができます。

SELECT * FROM table ORDER BY column IS NULL ASC, column ASC



例えばこんな感じのデータが入ったテーブルがあるとします。

+----+-------------+--------+------+---------------------+
| id | category_id | title  | text |      created        |
+----+-------------+--------+----------------------------+
|  1 |      1      | title1 | text | 2022-01-01 12:00:00 |
|  2 |      2      | title2 | text | 2022-01-02 12:00:00 |
|  3 |    NULL     | title3 | text | 2022-01-03 12:00:00 |
|  4 |      3      | title4 | text | 2022-01-04 12:00:00 |
|  5 |      1      | title5 | text | 2022-01-05 12:00:00 |
|  6 |    NULL     | title6 | text | 2022-01-06 12:00:00 |
+----+-------------+--------+------+---------------------+

カテゴリーのIDを紐づけたブログ記事のデータみたいなものをイメージです。

このデータに対して単純にカテゴリーIDでソートするとこんな感じになります。

SELECT * FROM table ORDER category_id ASC

+----+-------------+--------+------+---------------------+
| id | category_id | title  | text |      created        |
+----+-------------+--------+----------------------------+
|  3 |    NULL     | title3 | text | 2022-01-03 12:00:00 |
|  6 |    NULL     | title6 | text | 2022-01-06 12:00:00 |
|  1 |      1      | title1 | text | 2022-01-01 12:00:00 |
|  5 |      1      | title5 | text | 2022-01-05 12:00:00 |
|  2 |      2      | title2 | text | 2022-01-02 12:00:00 |
|  4 |      3      | title4 | text | 2022-01-04 12:00:00 |
+----+-------------+--------+------+---------------------+

NULLのデータが先に来ます。

でも先ほど書いた方法でソートするとこうなります。

SELECT * FROM table ORDER category_id IS NULL ASC, category_id ASC

+----+-------------+--------+------+---------------------+
| id | category_id | title  | text |      created        |
+----+-------------+--------+----------------------------+
|  1 |      1      | title1 | text | 2022-01-01 12:00:00 |
|  5 |      1      | title5 | text | 2022-01-05 12:00:00 |
|  2 |      2      | title2 | text | 2022-01-02 12:00:00 |
|  4 |      3      | title4 | text | 2022-01-04 12:00:00 |
|  3 |    NULL     | title3 | text | 2022-01-03 12:00:00 |
|  6 |    NULL     | title6 | text | 2022-01-06 12:00:00 |
+----+-------------+--------+------+---------------------+

IDの入ったデータは通常通り昇順でソートされ、IDがNULLのデータは後ろに来ていますね。

ASCは省略しても大丈夫です。ORDER BY句はASCやDESCを省略した場合は自動的にASCになります。



この書き方は今までやったことがなかったんですが、たまたま「並び替えの際にNULLのデータは常に上に来ないようにしてほしいんだけど」的なことを言われまして、そういや昇順の時にNULLを後ろに持ってくような書き方ってできないのかなあと思って調べたら、思ったよりも簡単にできました。

良かったらお試しあれ。
 もしかしたら何か関連しているかも? 
 質問や感想などお気軽にコメントしてください