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

MySQLのSUM()関数は一致する行がない場合どう評価される?NULLが返される理由を解説

MySQLのSUM()関数とNULLの関係

MySQLのSUM()関数は、SELECTステートメントで条件に一致する行が1件も存在しない場合、評価すべき値が存在しないため、結果としてNULLを返します。

多くの方は「合計なのだから0が返されるはず」と考えがちですが、実はこれは誤解です。0もれっきとした「数値」であり、一致する行が一切ない状況で0を返すことは意味を持ちません。そのため、MySQLはNULLを返す仕様になっています。

具体例:employee_tblテーブルでの確認

この挙動を理解するために、以下のレコードを持つ「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)

存在しない名前でSUM()を実行するとNULLが返る

次に、「Name」列に存在しない名前である「Mohan」が入力したページ数の合計を求めるクエリを実行してみます。

mysql> SELECT SUM(daily_typing_pages) FROM employee_tbl WHERE Name = 'Mohan';
+-------------------------+
| SUM(daily_typing_pages) |
+-------------------------+
|                    NULL |
+-------------------------+
1 row in set (0.00 sec)

このように、WHERE句の条件に一致する行が1件もないため、SUM()関数は集計対象となる値を持たず、結果としてNULLを返します。

NULLではなく0を返したい場合の対処法

アプリケーションの都合上、一致する行がない場合でも0として扱いたいケースはよくあります。そのような場合は、IFNULL()関数やCOALESCE()関数を組み合わせることで対応できます。

mysql> SELECT IFNULL(SUM(daily_typing_pages), 0) FROM employee_tbl WHERE Name = 'Mohan';
+------------------------------------+
| IFNULL(SUM(daily_typing_pages), 0) |
+------------------------------------+
|                                  0 |
+------------------------------------+
1 row in set (0.00 sec)

このように書くことで、集計結果がNULLの場合に自動的に0へ置き換えられ、後続の処理や表示で扱いやすくなります。SUM()関数のNULL挙動を正しく理解しておくことは、意図しないバグを防ぐうえで非常に重要です。

  1. JavaでMySQLのSELECTクエリにPreparedStatement(プリペアドステートメント)を使う方法

    executeQuery()メソッドの基本的な使い方JavaからMySQLに対してSELECTクエリを実行する場合は、PreparedStatementオブジェクトのexecuteQuery()メソッドを使用します。基本構文は以下の通りです。yourPreparedStatementObject = yourConnectionObject.prepareStatement(yourQueryName);yourResultSetObject = yourPreparedStatementObject.executeQuery();それでは、実際にサンプルデータベース「sample」を使って手

  2. MySQLのCONCAT_WS()関数で文字列を連結しながら条件に一致する行を抽出する方法

    MySQLのCONCAT_WS()関数とはMySQLでは、CONCAT_WS()関数を使用することで、複数のカラムや値を指定した区切り文字で連結できます。さらにWHERE句と組み合わせれば、条件に一致する行だけを抽出しながら、読みやすい形式の文字列として出力することも可能です。この記事では、実際にテーブルを作成し、CONCAT_WS()と条件指定を組み合わせたクエリの実行例を順番に解説します。サンプルテーブルの作成まず、ユーザー情報を格納するテーブル「demo38」を作成しましょう。mysql> create table demo38-> (-> user_id int,-&