MySQLのSUM()関数におけるNULL値の評価方法とは?
SUM()関数におけるNULL値の扱い
MySQLのSUM()関数は、集計対象の列にNULL値が含まれている場合、そのNULL値を自動的に除外し、NULL以外の値のみを合計します。重要なのは、NULLが「0」として加算されるのではなく、計算自体から除外されるという点です。
この動作を理解するために、次のようなデータを持つ「employee」テーブルを例に見ていきましょう。
mysql> Select * from Employee; +----+--------+--------+ | ID | Name | Salary | +----+--------+--------+ | 1 | Gaurav | 50000 | | 2 | Rahul | 20000 | | 3 | Advik | 25000 | | 4 | Aarav | 65000 | | 5 | Ram | 20000 | | 6 | Mohan | 30000 | | 7 | Aryan | NULL | | 8 | Vinay | NULL | +----+--------+--------+ 8 rows in set (0.00 sec)
このテーブルでは、ID 7(Aryan)とID 8(Vinay)のSalary列にNULL値が登録されています。
SUM()関数でNULL値を含む列を合計する
それでは、上記のテーブルから従業員全体の給与合計を求めてみます。SUM()関数を使用すると、NULL値は無視され、値が存在する6行分のみで合計が計算されます。
mysql> Select SUM(Salary) from Employee; +-------------+ | SUM(Salary) | +-------------+ | 210000 | +-------------+ 1 row in set (0.00 sec)
結果は「210000」となりました。これは50000+20000+25000+65000+20000+30000の合計であり、NULLの2行は計算に含まれていないことが分かります。
IS NOT NULL条件を使った検証
この結果は、WHERE句で「NULL以外」という条件を明示的に指定した場合と同じになることからも確認できます。
mysql> Select SUM(Salary) from Employee WHERE Salary IS NOT NULL; +-------------+ | SUM(Salary) | +-------------+ | 210000 | +-------------+ 1 row in set (0.00 sec)
両者の結果が完全に一致することから、SUM()関数が内部的にNULL値を除外して処理していることが実証されます。
注意点:すべてNULLの場合の戻り値
SUM()関数のもう一つの特徴として、集計対象の行の値がすべてNULLだった場合、0ではなくNULLを返すという点があります。アプリケーション側でNULLを避けたい場合は、IFNULL()関数と組み合わせるのが有効です。
mysql> Select IFNULL(SUM(Salary), 0) from Employee; +------------------------+ | IFNULL(SUM(Salary), 0) | +------------------------+ | 210000 | +------------------------+ 1 row in set (0.00 sec)
このように記述しておけば、該当データが一件も存在しないケースでもNULLの代わりに0が返されるため、後続の処理をシンプルに保てます。NULL値を含む列を集計する際は、これらの仕様を理解した上で設計することが大切です。
-
MySQLで列の値が文字列か数値かを判定して取得する方法
MySQLで列の値が文字列か数値かを判別する方法 MySQLでは、正規表現を使ったREGEXP演算子を利用することで、列の値が文字列なのか数値なのかを簡単に判別できます。 基本構文 文字列の値のみを取得したい場合は、以下の構文を使用します。 select *from yourTableName where yourColumnName NOT regexp ^[0-9]+$; 数値のみを取得したい場合は、以下の構文を使用します。 select *from yourTableName where yourColumnName regexp ^[0-9]+$; ここで使われている正規表現 ^[0
-
MySQLで月ごとにテーブルの値を合計する方法を解説
MySQLでテーブル内の値を月ごとに合計したい場合は、EXTRACT()関数を使用します。この関数を使うことで、日付から特定の月の情報を抽出できます。例えば、年に関係なく1月のすべての価格を合計したい場合などに便利です。サンプルテーブルの作成まず、デモ用のテーブルを作成しましょう。mysql> create table DemoTable1415 -> ( -> ProductPurchaseDate date, -> ProductPrice int -> ); Query OK, 0 rows affected (0.53 se