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が先頭に表示されてしまうため注意が必要です。
-
MySQLでNULL値を除外して残りの値だけを表示する方法
MySQLでは、IS NOT NULL演算子を使うことで、NULL値を除外し、実際に値が存在するレコードだけを取得・表示できます。本記事では、サンプルテーブルを作成しながら、具体的な手順をわかりやすく解説します。 1. テーブルを作成する まず、学生名とスコアを格納するテーブルを作成します。 mysql> create table DemoTable1458 -> ( -> StudentName varchar(20), ->
-
MySQLで特定の値を先頭に表示し、残りのレコードを昇順で並べ替える方法
はじめにMySQLでは、ORDER BY句に条件式を組み合わせることで、特定の値を持つ行を最前面に表示し、残りの行を昇順で並べ替えることができます。この記事では、具体的な手順をサンプルコードとともに解説します。テーブルの作成まず、サンプル用のテーブルを作成します。mysql> create table DemoTable -> ( -> MonthNumber int -> );Query OK, 0 rows affected (1.68 sec)レコードの挿入次に、INSERTコマンドを使ってテーブルに複数のレコードを挿入します。mysql>