🫥

MySQLによる"NULL"の扱いについて

2023/09/02に公開

前提

  • MySQL: 5.7.43

ORDER BY句によるソート結果でのNULL

以下のようなテーブルがあるとします。

mysql> select name, x from tmp;
+------+------+
| name | x    |
+------+------+
| A    |    3 |
| B    |    0 |
| C    | NULL |
| D    |     1|
+------+------+

ここで、xについてORDER BYで指定し昇順で表示させると、NULLが最も上位に表示されます。
逆に、降順でORDER BYを指定すると、NULLは最下位に表示されます。
これはNULLに対する仕様として把握しておいた方が良い内容です。

mysql> select name, x from Greatests order by x;
+------+------+
| name | x    |
+------+------+
| C    | NULL |
| B    |    0 |
| D    |    1 |
| A    |    3 |
+------+------+

mysql> select name, x from tmp order by x desc;
+------+------+
| name | x    |
+------+------+
| A    |    3 |
| D    |    1 |
| B    |    0 |
| C    | NULL |
+------+------+

NULLと文字列の結合

CONCAT関数は、以下のように引数を結合する関数です。

mysql> SELECT CONCAT('hoge', 'foo');
+-----------------------+
| CONCAT('hoge', 'foo') |
+-----------------------+
| hogefoo               |
+-----------------------+

ただし、引数の中に一つでもNULLが含まれる場合、出力結果はNULLとなってしまいます。
これは特に注意しなければならない仕様です。

mysql> SELECT CONCAT('hoge', 'foo', NULL);
+-----------------------------+
| CONCAT('hoge', 'foo', NULL) |
+-----------------------------+
| NULL                        |
+-----------------------------+

COALESCE関数

COALESCE関数とは、引数の中で一番最初の非NULL値を返す関数です。
NULLのデータが含まれる可能性のあるカラムなどがある場合は、この関数を使用した方が良いでしょう。

mysql> SELECT COALESCE(NULL,1, NULL);
        -> 1
mysql> SELECT COALESCE(NULL,NULL,NULL);
        -> NULL

Discussion