MySQLの集計関数とIF()関数を組み合わせる方法をわかりやすく解説
MySQLでは、集計関数(SUM()やCOUNT()など)とIF()関数を組み合わせることで、条件に応じた柔軟な集計結果を1つのクエリで取得できます。例えば、「特定の条件に合致する行数」と「合致しない行数」を同時に集計したい場合などに非常に便利です。
以下では、実際のクエリ例を使って、その使い方を詳しく見ていきましょう。
SUM()関数とIF()関数を組み合わせた例
mysql> Select SUM(IF(Language = 'English', 1, 0)) As English, SUM(IF(Language <> 'English',1,0)) AS "Non-English" from Students; +---------+-------------+ | English | Non-English | +---------+-------------+ | 5 | 4 | +---------+-------------+ 1 row in set (0.00 sec)
上記のクエリでは、'Students'テーブルに対して、SUM()集計関数とIF()関数を組み合わせています。IF(Language = 'English', 1, 0)により、言語が英語の場合は「1」、それ以外は「0」が返され、それらをSUM()で合計することで、英語を話す学生と英語以外を話す学生の人数をそれぞれ取得しています。
COUNT()関数とIF()関数を組み合わせた例
mysql> Select COUNT(IF(country = 'USA', 1, NULL))AS USA,
-> COUNT(IF(country = 'UK', 1, NULL))AS UK,
-> COUNT(IF(country = 'France', 1, NULL))AS France,
-> COUNT(IF(country = 'Russia', 1, NULL))AS Russia,
-> COUNT(IF(country = 'Australia', 1, NULL))AS Australia,
-> COUNT(IF(country = 'INDIA', 1, NULL))AS INDIA,
-> COUNT(IF(country = 'NZ', 1, NULL))AS NZ FROM Students;
+-----+----+--------+--------+-----------+-------+----+
| USA | UK | France | Russia | Australia | INDIA | NZ |
+-----+----+--------+--------+-----------+-------+----+
| 2 | 1 | 1 | 1 | 1 | 2 | 1 |
+-----+----+--------+--------+-----------+-------+----+
1 row in set (0.07 sec)このクエリでは、COUNT()集計関数とIF()関数を組み合わせて、'Students'テーブルに登録されている学生の国籍ごとの人数を一度に取得しています。IF()の第3引数にNULLを指定している点がポイントです。
SUM()とCOUNT()でNULLの扱いが異なる理由
COUNT()関数はNULL値をカウントしないという特性があります。そのため、条件に合致しない場合に0ではなくNULLを返すようにすると、意図した件数だけが正確にカウントされます。一方、SUM()関数は数値として加算するため、条件外の値には0を返すのが一般的です。
補足:CASE式による代替方法
同様の処理はCASE式でも実現できます。例えば「COUNT(CASE WHEN country = 'USA' THEN 1 END)」のように書けば、より複雑な条件分岐にも対応でき、コードの可読性も向上します。用途に応じてIF()とCASE式を使い分けるのがおすすめです。
-
MySQLのINTERVAL()関数をテーブルの列に適用する方法
INTERVAL()関数とテーブル列の組み合わせMySQLのINTERVAL()関数は、テーブルの列に対しても使用できます。その場合、関数の第1引数に列名を指定します。すると、その列に格納されているすべての値が、第2引数以降で指定した値と比較され、比較結果に基づいて結果セットが返されます。サンプルデータの確認ここでは、以下のような「employee」テーブルのデータを使用して、実際の動作を確認してみましょう。mysql> Select * from employee568; +----+--------+--------+ | ID | Name | Salary | +----+-
-
MySQLストアド関数の変更方法|ALTER FUNCTIONステートメントの使い方を解説
MySQLのストアド関数(ストアドファンクション)を変更するには、ALTER FUNCTIONステートメントを使用します。このステートメントを実行するには、あらかじめALTER ROUTINE権限が付与されている必要があります。ALTER FUNCTIONの基本構文ALTER FUNCTION function_name [characteristic ...] characteristic: { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } | SQL SECURITY { DEFINER | INVOKER