
SELECT文で指定したレコードの平均を取得するAVG関数の使い方を初心者向けにわかりやすく1から解説します。
参考 SELECT文
AVG関数は指定したカラムのレコードの平均値を取得します。"AVG" は平均を意味する "Average" の略です。
SELECT AVG(カラム名) FROM テーブル名;

このページではSQLにおけるAVG関数の利用方法・構文ルールを1からわかりやすく初心者向けにご説明します。
プログラマーやシステムエンジニアを目指す方であれば知らないと恥ずかしい超・基本知識です。是非最後までご覧ください。
SQL:AVG関数の使い方・構文ルール
SELECT AVG(カラム名) FROM テーブル名;
AVG関数の構文ルールはSUM関数と全く同じ。"AVG( )" のように平均値を求めたいカラムを( )で囲むだけ。

ここでは以下のようなテーブルを例にAVG関数の利用方法と処理結果を見ていきます。


成績の一覧テーブルから、Japanaeseカラムのレコードの平均値を取得したい場合は以下のように記述します。
SELECT AVG(Japanaese) FROM PointList; -- 結果「450」
SUM関数と同様に、複数のカラムを指定して合計値を取得することも可能です。
SELECT AVG(Japanese), AVG(Math), AVG(English) FROM PointList; -- AVG(Japanese)⇒45 -- AVG(Math) ⇒450 -- AVG(English) ⇒45
参考までにSUM関数のサンプルコードも記載しますが、構文ルールは全く同様です。
SELECT SUM(Japanese), SUM(Math), SUM(English) FROM PointList; -- AVG(Japanese)⇒360 -- AVG(Math) ⇒3600 -- AVG(English) ⇒360
AVG関数:NULL値の扱い
SUM関数と同様、AVG関数もNULL値を除外して平均値を計算します。
仮に以下のようなテーブルが存在する場合にAVG関数を利用するとどうなるか?


AVG関数は、計算の前にNULLの行を除外しその後で平均値を計算するため結果は以下のようになります。
SELECT AVG(Japanese),AVG(Math),AVG(English) FROM PointList; -- AVG「10」/ AVG「100」/ AVG「10」
レコード数自体は8個あるので、10(合計)÷8(レコード数) = 1.25 と出ると誤認される方がいますが、上記でも開設した通り「NULLは計算の前に除外される」ため、計算式は以下のようになります。
10(合計)÷1(レコード数)

データベーススペシャリスト試験などでもよく出題されるポイントなので頭に入れておきましょう!
-- テーブルの作成 CREATE TABLE students ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) NOT NULL, score INT NOT NULL ); -- レコードの追加 INSERT INTO students (name, score) VALUES ('Alice', 85), ('Bob', 90), ('Charlie', 80), ('David', 95), ('Eva', 78), ('Frank', NULL), ('Grace', NULL), ('Helen', 88); -- SELECT(AVG)の実行 SELECT AVG(score) AS average_score FROM students; -- 結果「86」
AVG関数は、デフォルトでNULL値を無視します。つまり、NULL値は平均計算には含まれません。上記の場合は、NULL値を持つ2名の学生(Frank
とGrace
)のスコアは計算に含まれません。
(85+90+80+95+78+88)/6 = 86

もし、COALESCE
関数を使用することで、NULL値を特定の値(例えば、0)で置き換えて平均を取ることも可能です。
SELECT AVG(COALESCE(score, 0)) AS average_score_with_nulls FROM students; -- COALESCE関数は、最初の非NULL値を返します。 -- 上記の例では、scoreがNULLの場合は0を返します。 -- したがって、このSQL文はNULL値を0として平均スコアの計算に含めます。
AVG関数:GROUP BY句との合わせ技
AVG関数は "GROUP BY" 句と併用して利用することが可能。
参考 GROUP BY句
一般的なシステムでAVG関数が用いられる場合は "GROUP BY" 句と同時に用いられることが非常に多いため、この使い方も併せて理解しておくと良いでしょう。

先ほどのPointListテーブルに性別を示すカラムを追加して考えてみましょう。

GROUP BY句にFM列を指定して実行した結果がこちら。
SELECT FM, AVG(Japanese) FROM PointList GROUP BY FM; /* 実行結果 +----------+-----------+ | FM | AVG | +----------+-----------+ | 男 | 10 | | 女 | 50 | +----------+-----------+ */

ご覧のように、指定したグループごとに結果を取得してくれます。
男:10(合計)÷1(レコード数)=10
女:350(合計)÷7(レコード数)=50
より実践的なサンプルコード
-- テーブルの作成 CREATE TABLE scores ( id INT PRIMARY KEY, student_name VARCHAR(255), subject VARCHAR(255), score INT ); -- データの挿入 INSERT INTO scores (id, student_name, subject, score) VALUES (1, 'John', 'Math', 80); INSERT INTO scores (id, student_name, subject, score) VALUES (2, 'John', 'Science', 90); INSERT INTO scores (id, student_name, subject, score) VALUES (3, 'Jane', 'Math', NULL); INSERT INTO scores (id, student_name, subject, score) VALUES (4, 'Jane', 'Science', 85); INSERT INTO scores (id, student_name, subject, score) VALUES (5, 'Bob', 'Math', 70); INSERT INTO scores (id, student_name, subject, score) VALUES (6, 'Bob', 'Science', 75); -- SCORE の平均を取得 SELECT AVG(score) FROM scores; -- 結果→80 -- SCORE の平均を subject ごとに取得 SELECT subject, AVG(score) FROM scores GROUP BY subject; /* 結果 subject | avg ---------|---------------------- Math | 75.0000000000000000 Science | 83.3333333333333333 GROUP BY句を使用して科目ごとにscoreの平均値を取得 この例では、MathとScienceの2つの科目ごとの平均値が表示されている */
参考 CREATE TABLE / INSERT
SQLを1から学習したい方は
SQLやデータベースの仕組みを1から学習したい方(学び直したい方)向けに、現役エンジニア達のスキルを結集して 完全無料 のSQL教材を作成しました。

SQLは決して難しい技術ではないので、エンジニアであれば「当たり前のように」扱えて当然かも・・・?
とはいえ、案外SQLをちゃんと使ったことがない人も多いはずです。この機会に是非一度ご覧になってみてください。
システムエンジニアを目指したい方は
システムエンジニアを目指す方や、IT知識を1から身につけたい方は以下のページをご覧ください。
正直どこから学び始めればよいかわからない。どのように勉強していけば、エンジニアとしてのスキルが磨けるか?が分からない・・・という方は必見です。

システムエンジニア向けに「できるエンジニア」になる方法を1から解説しておりますので、是非ご覧ください。