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挙動を正しく理解しておくことは、意図しないバグを防ぐうえで非常に重要です。
-
JavaでMySQLのSELECTクエリにPreparedStatement(プリペアドステートメント)を使う方法
executeQuery()メソッドの基本的な使い方JavaからMySQLに対してSELECTクエリを実行する場合は、PreparedStatementオブジェクトのexecuteQuery()メソッドを使用します。基本構文は以下の通りです。yourPreparedStatementObject = yourConnectionObject.prepareStatement(yourQueryName);yourResultSetObject = yourPreparedStatementObject.executeQuery();それでは、実際にサンプルデータベース「sample」を使って手
-
MySQLのCONCAT_WS()関数で文字列を連結しながら条件に一致する行を抽出する方法
MySQLのCONCAT_WS()関数とはMySQLでは、CONCAT_WS()関数を使用することで、複数のカラムや値を指定した区切り文字で連結できます。さらにWHERE句と組み合わせれば、条件に一致する行だけを抽出しながら、読みやすい形式の文字列として出力することも可能です。この記事では、実際にテーブルを作成し、CONCAT_WS()と条件指定を組み合わせたクエリの実行例を順番に解説します。サンプルテーブルの作成まず、ユーザー情報を格納するテーブル「demo38」を作成しましょう。mysql> create table demo38-> (-> user_id int,-&