MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLでNULL値を含むカラムを並べ替える方法|IS NULLとORDER BYの活用

MySQLでは、ORDER BY句で並べ替えを行う際、NULL値がどの位置に表示されるか悩むことがあります。本記事では、IS NULL演算子を組み合わせることで、NULL値を含むレコードを末尾にまとめて並べ替える方法を、実際のサンプルコードとともにわかりやすく解説します。

テーブルの作成

まず、サンプル用のテーブルを作成します。

mysql> create table DemoTable707 (
    StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    StudentFirstName varchar(100),
    StudentMarks int
);
Query OK, 0 rows affected (0.59 sec)

レコードの挿入

続いて、INSERTコマンドでレコードを挿入します。ここでは意図的に、StudentFirstNameがNULLのレコードもいくつか含めています。

mysql> insert into DemoTable707(StudentFirstName,StudentMarks) values('John',45);
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable707(StudentFirstName,StudentMarks) values(NULL,65);
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable707(StudentFirstName,StudentMarks) values('Chris',78);
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable707(StudentFirstName,StudentMarks) values(NULL,89);
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable707(StudentFirstName,StudentMarks) values('Robert',99);
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable707(StudentFirstName,StudentMarks) values(NULL,34);
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable707(StudentFirstName,StudentMarks) values('Mike',43);
Query OK, 1 row affected (0.20 sec)

登録データの確認

SELECT文でテーブル内のすべてのレコードを表示してみましょう。

mysql> select *from DemoTable707;

実行結果は以下の通りです。

+-----------+------------------+--------------+
| StudentId | StudentFirstName | StudentMarks |
+-----------+------------------+--------------+
| 1         | John             | 45           |
| 2         | NULL             | 65           |
| 3         | Chris            | 78           |
| 4         | NULL             | 89           |
| 5         | Robert           | 99           |
| 6         | NULL             | 34           |
| 7         | Mike             | 43           |
+-----------+------------------+--------------+
7 rows in set (0.00 sec)

NULL値を考慮した並べ替えクエリ

以下のクエリを実行すると、NULL値のレコードを末尾にまとめて並べ替えることができます。

mysql> select *from DemoTable707 order by StudentFirstName IS NULL, StudentFirstName DESC;

実行結果は以下の通りです。

+-----------+------------------+--------------+
| StudentId | StudentFirstName | StudentMarks |
+-----------+------------------+--------------+
| 5         | Robert           | 99           |
| 7         | Mike             | 43           |
| 1         | John             | 45           |
| 3         | Chris            | 78           |
| 2         | NULL             | 65           |
| 4         | NULL             | 89           |
| 6         | NULL             | 34           |
+-----------+------------------+--------------+
7 rows in set (0.00 sec)

仕組みの解説

StudentFirstName IS NULLという式は、値がNULLの場合に「1」、NULLでない場合に「0」を返します。これを第1ソートキー(昇順)として指定することで、NULLでないレコードが先頭に、NULLのレコードが最後に集まる仕組みです。さらに第2ソートキーとしてStudentFirstName DESCを指定しているため、名前は降順(Robert → Mike → John → Chris)で並びます。

なお、逆にNULL値を先頭に表示したい場合は、この式にDESCを付けて降順にソートするだけで簡単に対応できます。

  1. 【MySQL】空の値(空文字列)をNULLに変換するUPDATEクエリの書き方

    MySQLでは、UPDATE文のSET句とWHERE句を組み合わせるだけで、カラムに入っている空の値(空文字列)をNULLへ簡単に変換できます。ここからは、実際のサンプルを使って手順を詳しく解説していきます。 1. サンプルテーブルを作成する まず、以下のコマンドでテーブルを作成しましょう。 mysql> create table DemoTable1315 -> ( -> CountryName varchar(10) -> ); Query OK, 0 rows affected (0.60 sec) 2. レコードを挿入する 次に、INSERTコマンドでレコー

  2. MySQLでNULL値を1として表示・更新する方法

    MySQLでは、テーブル内のNULL値を別の値(たとえば「1」)に置き換えて扱いたい場面があります。この記事では、IFNULL関数とUPDATE文を組み合わせて、NULL値を1に変換する具体的な手順をサンプルコード付きで解説します。 1. サンプルテーブルを作成する まず、動作確認用のテーブルを作成します。 mysql> create table DemoTable1963 ( Counter int ); Query OK, 0 rows affected (0.00 sec) 2. レコードを挿入する INSERT文を使って、NULLを含む複数のレコードを