値を持たない列を引数に渡した場合、MySQLのSUM()関数は何を返すのか
値を持たない列に対するSUM()関数の動作
MySQLのSUM()関数に、値が1つも格納されていない列(空の列)を引数として渡した場合、出力としては0ではなくNULLが返されます。これは列のデータ型に関係なく同じ動作となります。
直感的には「合計だから0になるのでは?」と思いがちですが、SUM()関数は集計対象となる行が存在しない場合、結果を確定できないためNULLを返す仕様になっています。以下の例で確認してみましょう。
例:空のテーブルでのSUM()関数
ここでは、「id」という1つの列のみを持ち、かつデータが1件も登録されていないテーブル「social」を使用します。
mysql> Describe Social; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | Id | int(11) | YES | | NULL | | | Name | varchar(20) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 2 rows in set (0.00 sec) mysql> Select * from Social; Empty set (0.00 sec) mysql> Select SUM(id) from Social; +---------+ | SUM(id) | +---------+ | NULL | +---------+ 1 row in set (0.00 sec) mysql> Select SUM(Name) from Social; +-----------+ | SUM(Name) | +-----------+ | NULL | +-----------+ 1 row in set (0.00 sec)
上記の出力から分かるように、数値型のid列だけでなく、文字列型のName列を引数に渡した場合でも、どちらもNULLが返されています。テーブル自体が空であるため、SUM()関数は集計する対象を持たず、その結果としてNULLを返すのです。
NULLではなく0を返したい場合
アプリケーション側で0として扱いたい場合は、COALESCE()関数やIFNULL()関数を組み合わせるのが一般的です。
mysql> SELECT COALESCE(SUM(id), 0) FROM Social; +----------------------+ | COALESCE(SUM(id), 0) | +----------------------+ | 0 | +----------------------+ 1 row in set (0.00 sec)
このように書くことで、集計対象が存在しない場合でもNULLの代わりに0を取得できます。レポートや集計処理などでNULLを許容したくない場面では、ぜひ活用してください。
-
MySQLでNULL値が複数ある列にDISTINCT句を使うとどうなる?返される結果を解説
NULL値が複数ある列にDISTINCT句を使った場合のMySQLの動作 MySQLでは、複数のNULL値が含まれる列に対してDISTINCT句を使用すると、すべてのNULL値は同一の値として扱われます。 これはDISTINCT句の仕様によるもので、結果セットにはNULL値が1つだけ返され、残りの重複するNULL値は除外されます。一見するとNULLは「値ではない」ため区別されそうに思えますが、MySQLはDISTINCT処理においてNULL同士を等しいものとみなす点に注意が必要です。 具体例:testingテーブルでの確認 ここでは、列「Lname」に複数のNULL値が含まれるテーブル「te
-
MySQLで列の値を合計する方法|SUM関数の使い方を解説
MySQLである列の値の合計を求めたい場合は、集計関数 SUM() を使用します。SUM関数は、指定したカラム(列)に格納されている数値をすべて加算し、その合計値を1つの結果として返してくれる便利な関数です。ここでは、実際にサンプルテーブルを作成し、SUM関数で列の合計値を取得する手順を順番に見ていきましょう。1. サンプルテーブルの作成まずは、CREATE TABLE文でテスト用のテーブルを作成します。 ); Query OK, 0 rows affected (0.71 sec)この例では、自動採番される主キー「Id」と、金額を格納する整数型のカラム「€」を持つテーブルを作成しています。2