概要:このチュートリアルでは、SQL AVG関数を使用して集合の平均値を取得する方法を説明します。
SQL AVG関数の紹介
SQL AVG関数は、集合の平均値を計算する集計関数です。以下に、SQL AVG関数の構文を示します。
AVG([ALL|DISTINCT] expression)
Code language: SQL (Structured Query Language) (sql)
ALLキーワードを使用すると、AVG関数はすべての値を計算に使用します。デフォルトでは、AVG関数はALLキーワードを指定するかどうかに関わらずALLを使用します。
DISTINCTキーワードを明示的に指定すると、AVG関数は一意の値のみを計算に使用します。
たとえば、(1,2,3,3,4)という集合があり、これにAVG(ALL)を適用すると、AVG関数は次の計算を実行します。
(1+2+3+3+4)/5 = 2.6
Code language: SQL (Structured Query Language) (sql)
しかし、AVG(DISTINCT)は次のように処理されます。
(1+2+3+4)/4 = 2.5
Code language: SQL (Structured Query Language) (sql)
SQL AVG関数の例
サンプルデータベースのemployees
テーブルを使用して、SQL AVG関数の動作方法を示します。次の図は、employees
テーブルの構造を示しています。

すべての従業員の平均給与を計算するには、次のように給与列にAVG関数を適用します。
SELECT
AVG(salary)
FROM
employees;
Code language: SQL (Structured Query Language) (sql)

DISTINCT演算子を使用して、結果が変わるかどうかを確認してみましょう。
SELECT
AVG(DISTINCT salary)
FROM
employees;
Code language: SQL (Structured Query Language) (sql)

一部の従業員が同じ給与を受けているため、結果が変わりました。
結果を小数点以下2桁に丸めるには、次のようにROUND関数を使用します。
SELECT
ROUND(AVG(DISTINCT salary), 2)
FROM
employees;
Code language: SQL (Structured Query Language) (sql)

値のサブセットの平均値を計算するには、WHERE句をSELECT文に追加します。たとえば、部署IDが5である従業員の平均給与を計算するには、次のクエリを使用します。
SELECT
AVG(DISTINCT salary)
FROM
employees
WHERE
department_id = 5;
Code language: SQL (Structured Query Language) (sql)

次の文は、ジョブIDが6である従業員の平均給与を返します。
SELECT
AVG(salary)
FROM
employees
WHERE
job_id = 6;
Code language: SQL (Structured Query Language) (sql)

GROUP BY句を使用したSQL AVGの例
グループの平均値を計算するには、GROUP BY句と共にAVG関数を使用します。たとえば、次の文は、各部署とその部署の従業員の平均給与を返します。
SELECT
department_id,
AVG(salary)
FROM
employees
GROUP BY
department_id;
Code language: SQL (Structured Query Language) (sql)

内部結合句を使用して、employees
テーブルとdepartments
テーブルを結合し、部署名データを取得することができます。
SELECT
e.department_id,
department_name,
AVG(salary)
FROM
employees e
INNER JOIN departments d ON d.department_id = e.department_id
GROUP BY
e.department_id;
Code language: SQL (Structured Query Language) (sql)

ORDER BY句を使用したSQL AVGの例
AVGの結果を含む結果セットをソートするには、次のようにORDER BY句でAVG関数を使用します。
SELECT e.department_id, department_name, AVG(salary) FROM employees e INNER JOIN departments d ON d.department_id = e.department_id GROUP BY e.department_id ORDER BY AVG(salary) DESC;

HAVING句を使用したSQL AVGの例
グループをフィルタリングするには、HAVING句でAVG関数を使用します。たとえば、次の文は、平均給与が5000未満の部署を取得します。

サブクエリを使用したSQL AVG
1つのSQL文でAVG関数を複数回適用して、平均値の集合の平均値を計算できます。
たとえば、AVG関数を使用して各部署の従業員の平均給与を計算し、AVG関数をもう一度適用して部署の平均給与を計算できます。
次のクエリはその考え方を示しています。
SELECT
AVG(employee_sal_avg)
FROM
(
SELECT
AVG(salary) employee_sal_avg
FROM
employees
GROUP BY
department_id
) t;
Code language: SQL (Structured Query Language) (sql)
クエリの動作方法。
- サブクエリは、各部署の従業員の平均給与の集合を返します。
- 外部クエリは、部署の平均給与を返します。
このチュートリアルでは、SQL AVG関数を使用して集合の平均値を計算する方法を学習しました。