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

MySQLで非NULL値を昇順にソートし、NULL値を最後に表示する方法

MySQLでデータを取得する際、「値が入っているレコード(非NULL)を昇順で先に表示し、NULL値は後回しにしたい」というケースがあります。これを実現するには、ORDER BY ISNULL() を使用します。

ISNULL()関数とは

ISNULL()関数は、引数がNULLの場合に「1」、NULL以外の場合に「0」を返します。そのため、ORDER BY句でこの関数を使うと、0(非NULL)のレコードが先に、1(NULL)のレコードが後に並びます。

サンプルテーブルの作成

まず、動作確認用のテーブルを作成しましょう。

mysql> create table DemoTable669
(
    StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    StudentScore int
);
Query OK, 0 rows affected (0.55 sec)

テストデータの挿入

INSERT文を使って、いくつかのレコードを挿入します。意図的にNULL値も含めています。

mysql> insert into DemoTable669(StudentScore) values(45);
Query OK, 1 row affected (0.80 sec)
mysql> insert into DemoTable669(StudentScore) values(null);
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable669(StudentScore) values(89);
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable669(StudentScore) values(null);
Query OK, 1 row affected (0.15 sec)

登録済みレコードの確認

SELECT文ですべてのレコードを表示してみます。

mysql> select * from DemoTable669;

実行結果は以下の通りです。現時点ではNULL値が混在した状態になっています。

+-----------+--------------+
| StudentId | StudentScore |
+-----------+--------------+
|         1 |           45 |
|         2 |         NULL |
|         3 |           89 |
|         4 |         NULL |
+-----------+--------------+
4 rows in set (0.00 sec)

非NULL値を昇順で表示し、NULL値を後に配置するクエリ

以下のクエリを実行すると、NULL以外の値が昇順で先に表示され、NULL値はその後に表示されます。

mysql> select * from DemoTable669
ORDER BY ISNULL(StudentScore), StudentScore;

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

+-----------+--------------+
| StudentId | StudentScore |
+-----------+--------------+
|         1 |           45 |
|         3 |           89 |
|         2 |         NULL |
|         4 |         NULL |
+-----------+--------------+
4 rows in set (0.00 sec)

結果の解説

このクエリでは、まずISNULL(StudentScore)によるソートが優先されます。非NULLのレコードは「0」、NULLのレコードは「1」と評価されるため、45や89といった実際のスコアが先頭に来ます。同じ「0」の中では、次のキーであるStudentScore(昇順)に従って45 → 89の順に並びます。最後に、NULLのレコード(ID: 2と4)がまとめて表示される仕組みです。

補足:DESCを使う場合の注意点

降順(DESC)で並べたい場合も同様に「ISNULL(カラム名), カラム名 DESC」のように記述すれば、NULLを最後に残したまま降順ソートが可能です。単純に「カラム名 DESC」とだけ書くと、MySQLではNULLが先頭に表示されてしまうため注意が必要です。

  1. MySQLでNULL値を除外して残りの値だけを表示する方法

    MySQLでは、IS NOT NULL演算子を使うことで、NULL値を除外し、実際に値が存在するレコードだけを取得・表示できます。本記事では、サンプルテーブルを作成しながら、具体的な手順をわかりやすく解説します。 1. テーブルを作成する まず、学生名とスコアを格納するテーブルを作成します。 mysql> create table DemoTable1458     -> (     -> StudentName varchar(20),     ->

  2. MySQLで特定の値を先頭に表示し、残りのレコードを昇順で並べ替える方法

    はじめにMySQLでは、ORDER BY句に条件式を組み合わせることで、特定の値を持つ行を最前面に表示し、残りの行を昇順で並べ替えることができます。この記事では、具体的な手順をサンプルコードとともに解説します。テーブルの作成まず、サンプル用のテーブルを作成します。mysql> create table DemoTable -> ( -> MonthNumber int -> );Query OK, 0 rows affected (1.68 sec)レコードの挿入次に、INSERTコマンドを使ってテーブルに複数のレコードを挿入します。mysql>