MySQLでAVG関数を使う際に「0」のデータを除外する方法
MySQLで平均値を計算する際、「0」のデータを除外したいケースはよくあります。例えば、テスト未受験の生徒を0点として登録している場合などです。このような場合、NULLIF()関数とAVG()関数を組み合わせることで簡単に実現できます。
NULLIF()とAVG()を組み合わせる仕組み
NULLIF(値, 0) は、第1引数の値が第2引数(ここでは0)と等しい場合にNULLを返します。そしてAVG()関数はNULL値を無視して平均を計算するため、結果的に「0」のデータが除外された平均値が求められます。
基本構文
SELECT AVG(NULLIF(yourColumnName, 0)) AS anyAliasName FROM yourTableName;
サンプルテーブルの作成
まず、動作確認用のテーブルを作成しましょう。
mysql> create table AverageDemo
- > (
- > Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
- > StudentName varchar(20),
- > StudentMarks int
- > );
Query OK, 0 rows affected (0.72 sec)レコードの挿入
次に、INSERTコマンドを使ってテーブルにいくつかのレコードを挿入します。ここでは意図的にNULLと0を含むデータを用意しています。
mysql> insert into AverageDemo(StudentName,StudentMarks) values('Adam',NULL);
Query OK, 1 row affected (0.12 sec)
mysql> insert into AverageDemo(StudentName,StudentMarks) values('Larry',23);
Query OK, 1 row affected (0.19 sec)
mysql> insert into AverageDemo(StudentName,StudentMarks) values('Mike',0);
Query OK, 1 row affected (0.20 sec)
mysql> insert into AverageDemo(StudentName,StudentMarks) values('Sam',45);
Query OK, 1 row affected (0.18 sec)
mysql> insert into AverageDemo(StudentName,StudentMarks) values('Bob',0);
Query OK, 1 row affected (0.12 sec)
mysql> insert into AverageDemo(StudentName,StudentMarks) values('David',32);
Query OK, 1 row affected (0.18 sec)テーブルの内容を確認
SELECT文を使って、テーブル内のすべてのレコードを表示します。
mysql> select *from AverageDemo;
以下が出力結果です。
+----+-------------+--------------+ | Id | StudentName | StudentMarks | +----+-------------+--------------+ | 1 | Adam | NULL | | 2 | Larry | 23 | | 3 | Mike | 0 | | 4 | Sam | 45 | | 5 | Bob | 0 | | 6 | David | 32 | +----+-------------+--------------+ 6 rows in set (0.00 sec)
「0」を除外して平均値を計算する
それでは、AVG関数の使用時に「0」のエントリを除外するクエリを見てみましょう。
mysql> select AVG(nullif(StudentMarks, 0)) AS Exclude0Avg from AverageDemo;
以下が出力結果です。
+-------------+ | Exclude0Avg | +-------------+ | 33.3333 | +-------------+ 1 row in set (0.05 sec)
結果の検証
「0」を除外した場合、対象となるのは23、45、32の3件です。(23 + 45 + 32) ÷ 3 = 33.3333... となり、出力結果と一致します。
ちなみに、NULLIFを使わずに単純に AVG(StudentMarks) とした場合は、0も計算対象に含まれるため (23 + 0 + 45 + 0 + 32) ÷ 5 = 20 という結果になります。AdamのNULLはどちらの場合も自動的に無視される点にも注意してください。
このように、NULLIF()を活用すれば「0」を意味のあるデータとして扱いたくない場合でも、シンプルなクエリで正確な平均値を求めることができます。
-
MySQLでSUM()とIF()を組み合わせて条件付き集計を行う方法
はい、MySQLではSUM()とIF()を組み合わせて使用できます。この2つを併用すると、「特定の条件に一致する値だけを数える」「条件ごとに集計する」といった柔軟な処理が可能になります。ここでは、実際にデモテーブルを作成しながら、その使い方を順番に見ていきましょう。 1. デモテーブルを作成する まず、動作確認用のサンプルテーブルを作成します。 mysql> create table DemoTable ( Value int, Value2 int ); Query OK, 0 rows affected (0.51 sec) 2. テーブルにデータを挿入する I
-
ApacheとMySQLを連携させる方法|ユーザー認証とログ管理の基本
ApacheとMySQLの連携とは本記事では、Webサーバー「Apache」とデータベース「MySQL」を組み合わせて活用する方法を解説します。Apacheは、Apache Software Foundationによって開発・保守されているWebサーバーソフトウェアです。ユーザーからWebページへのアクセス要求(リクエスト)を受け付け、いくつかのセキュリティチェックを実施したうえで、目的のページへとユーザーを誘導します。MySQLによるユーザー認証MySQLデータベースを使ってユーザー認証を行えるプログラムは数多く存在します。これらのプログラムを利用すれば、アクセスログをMySQLのテーブルに