MySQLのSUM()関数で一致する行がない場合にNULLではなく0を返す方法
MySQLでは、SUM()関数は一致する行が存在しない場合にNULLを返します。しかし、集計結果をアプリケーションで扱う際などには、NULLではなく0を返してほしいケースが少なくありません。
このような場合に活躍するのが、MySQLのCOALESCE()関数です。COALESCE()関数は2つの引数を受け取り、最初の引数がNULLであれば2番目の引数を返し、NULLでなければ最初の引数をそのまま返します。これを利用することで、SUM()の結果がNULLになるのを防ぎ、代わりに0を表示させることができます。
サンプルテーブルの準備
この概念を理解するために、以下のレコードを持つ「employee_tbl」テーブルを例に考えてみましょう。
mysql> SELECT * FROM employee_tbl; +------+------+------------+--------------------+ | id | name | work_date | daily_typing_pages | +------+------+------------+--------------------+ | 1 | John | 2007-01-24 | 250 | | 2 | Ram | 2007-05-27 | 220 | | 3 | Jack | 2007-05-06 | 170 | | 3 | Jack | 2007-04-06 | 100 | | 4 | Jill | 2007-04-06 | 220 | | 5 | Zara | 2007-06-06 | 300 | | 5 | Zara | 2007-02-06 | 350 | +------+------+------------+--------------------+ 7 rows in set (0.00 sec)
COALESCE()とSUM()を組み合わせた実行例
次に、COALESCE()関数とSUM()関数を組み合わせて、「Name」列に存在しない名前「Mohan」が入力したページ数の合計を求めてみます。通常であればSUM()はNULLを返しますが、COALESCE()を挟むことで結果は0になります。
mysql> SELECT COALESCE(SUM(daily_typing_pages),0) AS 'SUM(daily_typing_pages)' FROM employee_tbl WHERE Name = 'Mohan'; +-------------------------+ | SUM(daily_typing_pages) | +-------------------------+ | 0 | +-------------------------+ 1 row in set (0.00 sec)
このように、COALESCE(SUM(列名), 0)という書き方を使えば、該当する行が1件も存在しない場合でも、集計結果をNULLではなく0として取得できます。レポート作成やアプリケーション側でのNULLチェックを省略したい場合に、非常に便利なテクニックです。
-
MySQLで設定したインデックスを確認・表示する方法【SHOW INDEXコマンド】
MySQLで作成済みのインデックスを確認したい場合は、SHOWコマンドを使用します。この記事では、実際にテーブルとインデックスを作成しながら、インデックス情報を表示する手順をわかりやすく解説します。インデックスを表示する基本構文テーブルに設定されたインデックスの一覧を取得するには、以下の構文を使用します。show index from テーブル名;サンプルテーブルの作成まず、動作確認用のテーブルを作成しましょう。以下の例では、自動採番される主キー「Id」と、姓名を格納するカラムを持つテーブルを定義しています。mysql> create table DemoTable (
-
MySQLのWHERE句でSUM()関数の結果は使用できる?HAVING句を使った正しい書き方を解説
MySQLでは、SUM()などの集計関数の結果をWHERE句で直接使用することはできません。これは、WHERE句がグループ化の前に行単位で評価されるためです。代わりに、GROUP BYと組み合わせたHAVING句を使うことで、集計結果に基づいた絞り込みが可能になります。 ここからは、実際にサンプルテーブルを作成しながら手順を確認していきましょう。 1. サンプルテーブルの作成 まず、名前と価格を持つテーブルを作成します。 mysql> create table DemoTable ( Name varchar(50), Price int ); Query OK, 0