MySQLのIFNULL関数について聞いたことがないという方もいるかもしれません。確かにIFNULL関数は、MySQLを使い始めた人にとってはあまり使うことがない関数。しかし、知っておくと意外なところで便利な使い方ができる関数なのです。
今回の記事では、MySQLのIFNULL関数の概要について分かりやすく説明をしつつ、IFNULL関数を体験できるハンズオンを紹介。本記事を読み、MySQLのIFNULL関数をマスターしましょう!
- MySQLのIFNULL関数は、NULL値を他の文言に置き換えられる関数
- MySQLを使ったIFNULLのハンズオン
MySQLのIFNULL関数とは?
MySQLのIFNULL関数とは、NULLの値を指定した値に置換することができる関数です。
もしデータベースのテーブル上にNULLの値がある場合、SELECT文で取得すると、そのまま「NULL」と表示されてしまいます。データベースの使用者が自分だけであれば、そのままでも問題はないかもしれません。しかし、もしWEBアプリケーションをデプロイした場合、ユーザーの目に触れることもありえます。
MySQLなどのデータベースに対してある程度の知識がある人なら「NULL」と書かれていても「値がNULLなのだ」と理解できますが、データベースについて知識がない人からすると理解できないでしょう。理解できない結果が返ってくることで、WEBアプリケーションに対するユーザーの信頼度は著しく損なわれます。
そこで「NULL」を「値がない状態です」などの文言に置き換えてあげると良いでしょう。知識のないユーザー目線からすれば、分かりやすい表示だと言えます。
「NULL」の値を他の文言に置き換えたい時に活躍するのがMySQLのIFNULL関数なのです。
MySQL IFNULL関数の構文
MySQL IFNULL関数の構文は以下の形式です。
IFNULL関数の構文
SELECT IFNULL(カラム名, ‘置き換える値’) FROM テーブル名;
SELECTステートメントは、テーブルの指定カラムからレコード内データを取得する働きがあります。SELECTステートメントで指定したカラム自体をIFNULLの第1引数に設定し、第2引数に置き換える値を設定しましょう。
イメージがしづらい人は、SELECTステートメントの構文を確認してみることで、IFNULL関数の構文が整理できるはずです。
SELECT文
SELECT カラム名 FROM テーブル名;
MySQL IFNULL関数の使用例
こちらでMySQLのIFNULL関数を実際に使用した例をご紹介します。
以下のようなテーブルがある前提で説明を進めます。
animalsテーブル
+--------+------+ | animal | age | +--------+------+ | cat | NULL | | dog | 12 | | tiger | 20 | | lion | NULL | +--------+------+
現在、animalsテーブルには「animal(動物の名前)」カラムと「age(年齢)」カラムの2つがあります。しかし「dog」と「lion」レコードの「age」カラムにはNULLが入っています。そこで「NULL」を「年齢不詳」という文言に置き換えて取得してみましょう。
IFNULLを含むSELECTステートメント
SELECT animal, IFNULL(age, '年齢不詳') FROM animals;
出力結果
+--------+-----------------------------+ | animal | IFNULL(age, '年齢不詳') | +--------+-----------------------------+ | cat | 年齢不詳 | | dog | 12 | | tiger | 20 | | lion | 年齢不詳 | +--------+-----------------------------+ 4 rows in set (0.01 sec)
IFNULLでの置換が反映したテーブルが出力されました。このようにレコード内にNULLが入っていれば、簡単に別のキーワードへと置き換えることができます。
【関連記事】
▶︎【ハンズオン】SQLのNVL関数とは?概要や使い方を丁寧に説明!
▶︎MySQLのNULL判定はどうやる? 除外判定やNULLのSUMを取得するには?
MySQLでCASEハンズオンにトライ
こちらでは、実際にMySQLというデータベースを使用してCASEを使ってみましょう。
準備
まずはMySQLを使用するための準備をしていきます。
MySQLのインストール・接続
まだMySQLをインストールしていない場合は、インストールしましょう。
$ brew install mysql
MySQLのインストールが終了したら、接続します。
$ sudo mysql -u root -p
データベースの作成
次にデータベースをMySQL上に作成し、使用するデータベースを指定しましょう。
mysql> CREATE DATABASE potepan; Query OK, 1 row affected (0.00 sec) mysql> USE potepan;
これでMySQLを使用する準備は完了しました。
ベースとなるテーブルの作成
次にベースとなるテーブルを作成しましょう。
CREATE TABLE products (name VARCHAR(50), stock INT, expiration_date DATE);
上記のテーブルは以下の想定でレコードの挿入を行います。
- nameカラム → 商品名
- stockカラム → 在庫数
- expiration_dateカラム → 賞味期限
実際にINSERTステートメントを使用して、レコードの挿入を行いましょう。
INSERT INTO products VALUES('Milk', NULL, '2019-12-18'),('Cookie', 20, NULL),(NULL, Query OK, 4 rows affected (0.00 sec)
テーブルの状態
SELECT * FROM products; +-------------+-------+-----------------+ | name | stock | expiration_date | +-------------+-------+-----------------+ | Milk | NULL | 2019-12-18 | | Cookie | 20 | NULL | | NULL | 15 | NULL | | Apple juice | 50 | 2019-12-25 | +-------------+-------+-----------------+ 4 rows in set (0.00 sec)
単一レコードにおけるNULLの置き換え
まずは先ほど提示した例の通り、単一レコード内にあるNULL値を他の文言に置き換えてみましょう。「stock」カラムのNULL値を「在庫数不明」という文言に置き換えます。
IFNULLを含むSELECTステートメント
SELECT name, IFNULL(stock, '在庫数不明'), expiration_date FROM products;
出力結果
+-------------+----------------------------------+-----------------+ | name | IFNULL(stock, '在庫数不明') | expiration_date | +-------------+----------------------------------+-----------------+ | Milk | 在庫数不明 | 2019-12-18 | | Cookie | 20 | NULL | | NULL | 15 | NULL | | Apple juice | 50 | 2019-12-25 | +-------------+----------------------------------+-----------------+ 4 rows in set (0.00 sec)
上記のSELECTステートメントで、stockカラムのNULL値を想定どおり置き換えることができました。
複数レコードにおけるNULLの一括置き換え
IFNULLにカラムを一括指定することで、全てのNULL値を指定した文言に置き換えることも可能です。
IFNULLを含むSELECTステートメント
SELECT IFNULL(name, '商品名不明'), IFNULL(stock, '在庫数不明'), IFNULL(expiration_date, '賞味期限不明') FROM products;
出力結果
+---------------------------------+----------------------------------+-----------------------------------------------+ | IFNULL(name, '商品名不明') | IFNULL(stock, '在庫数不明') | IFNULL(expiration_date, '賞味期限不明') | +---------------------------------+----------------------------------+-----------------------------------------------+ | Milk | 在庫数不明 | 2019-12-18 | | Cookie | 20 | 賞味期限不明 | | 商品名不明 | 15 | 賞味期限不明 | | Apple juice | 50 | 2019-12-25 | +---------------------------------+----------------------------------+-----------------------------------------------+ 4 rows in set (0.00 sec)
IFNULLの第1引数に各カラムを設定し、第2引数に置き換えたい文言をそれぞれ設定することで、思惑通り置き換えることができました。長いSELECTステートメントですが、やっていること自体は1つ目のハンズオンと特に変わりません。
まとめ
今回の記事では、MySQLのIFNULL関数の概要について分かりやすく説明をしつつ、IFNULL関数を体験できるハンズオンを紹介していきました。馴染みのない関数だったかもしれませんが、SELECTステートメントと共に気軽に使用することができ、使い勝手の良い関数です。データベースを操作する際には、IFNULL関数があることを意識しておくことでユーザビリティが高まりそうですね。
【関連記事】
▶︎MySQLのWHERE LIKEで検索機能向上!パターンマッチを学ぶ
▶︎MySQL初心者にマスターしてほしいコマンドラインからの使用方法
ちなみにIFNULL関数は、関係データベース管理システム(RDBMS)の中でもMySQLでしか使用できません。ただ、他の関係データベース管理システム、例えばOracleでは「NVL」関数、PostgreSQLでは「COALESCE」関数など、IFNULL関数と同じ役割を果たす関数が用意されています。普段MySQLを使用していないという方は、使い慣れた関係データベース管理システムにおいてIFNULL関数と同様の役割を果たす関数を使用してみるか、これを機にOracleを使ってみるといいでしょう。