【SQL基礎】AVG関数の基本構文
AVG関数は対象カラムの平均値を返す関数です。
SELECT文と併せて使います。
SELECT AVG(対象カラム名)
FROM 対象テーブル名;
AVG関数は数値型のデータに対して使用します。
本記事では例として以下のテーブル(テーブル名:teachers)を使用します。
1.数値に対してAVG関数を使用する。
例1.teachersテーブルのageカラムに対してAVG関数を使用する。
SELECT AVG(age) FROM teachers;
ageカラムの平均値を取得することができました。
2.対象カラム内にNULLがある場合
対象カラム内にNULLがある場合、NULLは無視されます。
つまり、AVG関数の使用に特に影響はありません。
本来、NULLを含む演算(NULL/2等)の結果はNULLになりますが、AVG関数においてはNULL以外の数値を平均した値を返してくれます。
例2.teachersテーブルのscoreカラムに対してAVG関数を使用する。
SELECT AVG(score) FROM teachers;
scoreカラムはNULLを含んでいますが、問題なく平均値を取得できています。
3.NULLを0として扱いたい場合
2.で対象カラムに存在するNULLは無視されると説明しました。
MAX/MIN関数やSUM関数ではNULLを意識しなくてもそれほど問題ありません。
(NULLを数値の0として考えても返す値が変わらない。)
ところが、AVG関数は平均値を取る関数なのでNULLを無視するのか数値の0として扱うのかで返す値が変わります。
具体例として、学校の成績をデータベースで管理しているケースを考えます。
期末テストの日に寝坊してテストを受けなかった生徒がいました。
その生徒のscoreカラムにはNULLが格納されているはずです。
テストを受けた人の平均点を知りたい場合は、NULLはNULLとして無視されたほうが都合がよいでしょう。
寝坊してテストを受けなかった人の点数を0として平均点を知りたい場合は、NULLを0に変換する必要があります。
MySQLでカラム内のNULLを数値の0として扱いたい場合はIFNULL関数を使います。
SELECT AVG(IFNULL(対象カラム名, 0))
FROM 対象テーブル名;
と記述することで、対象カラムのNULLを0に変換してくれます。
(IFNULL以外の関数を使用するデータベースもあります。例えば、OracleはNVLという関数を使用します。)
例3.teachersテーブルのscoreカラムに対してAVG関数を使用する。NULLは数値の0として扱う。
SELECT AVG(IFNULL(score, 0)) FROM teachers;
scoreカラムのNULLを0として扱ったことで、例2の結果とは違った値を取得しています。
4.WHERE句で条件を絞り込んだ結果、該当する行が存在しなかった場合
AVG関数とWHERE句は併用することができます。
WHERE句を使って条件を絞り込んだ結果該当する行が存在しなかった場合、AVG関数はNULLを返します。
例4.idが5より大きいという条件を付けて、teachersテーブルのscoreカラムに対してAVG関数を使用する。
SELECT SUM(score) FROM teachers WHERE id > 5;
teachersテーブルにはidが5より大きいレコードは存在しません。
そのため、AVG関数はNULLを返します。
学習のポイント
・AVG関数は平均値を返す集約関数である。
・AVG関数はNULLを数値として扱わないが、NULLを数値の0として扱いたい場合はIFNULL関数を使う。
練習問題
以下からダウンロード可能です。
また、ダウンロードしたら以下のようにしてworldcup2014データベースを作成し、インポートしてください。
※worldcup2014.zip解凍してできるworldcup2014.sqlファイルをCドライブ直下に配置した場合。
worldcup2014.zip
[sql] CREATE DATABASE worldcup2014;use worldcup2014
source C:\worldcup2014.sql
[/sql]
1.2014年ワールドカップ参加選手の平均身長と平均体重を求めてください。
playersテーブル(id,country_id,uniform_num,position,name,club,birth,height,weightの9つのカラムで構成されている)を使って答えを導いてください。