PostgreSQL 集約関数
集約関数(Aggregate functions)は、PostgreSQLにおいてデータの集計や分析を行うための中核的なツールです。これらを使用することで、テーブル内の複数の行にわたる計算を実行し、単一の集計結果を返すことができます。これらの関数は、データ分析、レポート生成、およびビジネス上の意思決定プロセスで広く活用されています。
膨大なデータから有益な情報を効率的に抽出するためには、集約関数の使い方をマスターすることが不可欠です。本章では、日常的な開発で最も頻繁に使用される5つの集約関数、COUNT、SUM、AVG、MIN、MAXについて詳しく解説します。
1. 集約関数とは何か?
集約関数は、一連のデータ行に対して操作を行い、単一の値を返します。
通常、これらは GROUP BY(グループ化)句と組み合わせて使用され、テーブル内の異なるグループごとに集約値を計算します。クエリ内で GROUP BY を省略した場合、集約関数はテーブル全体を一つの大きなグループとして扱い、テーブル全体に対して単一の結果を算出します。
1.1 基本的な構文
集約関数を使用する基本的な SQL 構文は以下の通りです。
SELECT aggregate_function(column_name)
FROM table_name
WHERE condition; -- 任意の WHERE 条件句例えば、customers(顧客)テーブルに登録されている顧客の総数を確認したい場合は、COUNT 関数を使用します。
SELECT COUNT(*)
FROM customers;2. COUNT 関数
COUNT 関数は、グループまたはテーブル内のデータ行数を返します。COUNT には主に2つのバリエーションがあります。
COUNT(*):NULL(空値)を含むすべての行をカウントします。COUNT(column_name):指定された列の中でNULLではない行の数をカウントします。
2.1 COUNT の一般的な使用例
1. テーブル内のすべての行をカウントする:
以下のデータを含む products(製品)テーブルがあると仮定します。
| product_id (製品ID) | product_name (製品名) | price (価格) |
|---|---|---|
| 1 | Laptop (ノートパソコン) | 1200 |
| 2 | Mouse (マウス) | 25 |
| 3 | Keyboard (キーボード) | 75 |
| 4 | Monitor (モニタ) | 300 |
| 5 | USB Drive (USBメモリ) | 15 |
products テーブルの製品総数を確認するには、以下のクエリを使用します。
SELECT COUNT(*)
FROM products;実行結果は 5 となります。
2. 特定の列の非 NULL 値をカウントする:
department(部門)列に NULL が含まれる可能性がある employees(従業員)テーブルを考えます。
| employee_id (従業員ID) | employee_name (従業員名) | department (所属部門) |
|---|---|---|
| 1 | John Doe | Sales (営業部) |
| 2 | Jane Smith | Marketing (マーケティング部) |
| 3 | David Lee | NULL |
| 4 | Sarah Brown | Sales (営業部) |
部門が割り当てられている(= department 列が NULL ではない)従業員の数をカウントするには、以下のように記述します。
SELECT COUNT(department)
FROM employees;実行結果は 3 となります。
3. 列内の重複を除いた(ユニークな)値をカウントする:
COUNT(DISTINCT column_name) を使用すると、特定の列に含まれる重複しない値の数を取得できます。上記の employees テーブルを使用して、ユニークな部門の数をカウントしてみましょう。
SELECT COUNT(DISTINCT department)
FROM employees;実行結果は 2 となります(Sales と Marketing の2つの異なる部門のみをカウントするため)。
3. SUM 関数
SUM 関数は、数値型の列に含まれるすべての値の合計を計算します。この際、NULL 値は自動的に無視されます。
3.1 SUM の一般的な使用例
1. すべての製品の合計価格を計算する:
先ほどの products テーブルを使用します。
SELECT SUM(price)
FROM products;実行結果は 1615 (1200 + 25 + 75 + 300 + 15) となります。
2. 注文ごとの合計金額を計算する:
以下のデータを含む order_items(注文明細)テーブルがあると仮定します。
| order_id (注文ID) | product_id (製品ID) | quantity (数量) | unit_price (単価) |
|---|---|---|---|
| 1 | 1 | 2 | 1200 |
| 1 | 2 | 5 | 25 |
| 2 | 3 | 1 | 75 |
| 2 | 4 | 1 | 300 |
注文ごとの合計金額を計算するには、以下のように記述します。
SELECT order_id, SUM(quantity * unit_price) AS total_amount
FROM order_items
GROUP BY order_id;実行結果は以下の通りです。
| order_id | total_amount |
|---|---|
| 1 | 2525 |
| 2 | 375 |
3. SUM における NULL 値の扱い:
列に NULL 値が含まれている場合、SUM はそれらを無視します。
| item_id (項目ID) | price (価格) |
|---|---|
| 1 | 10 |
| 2 | 20 |
| 3 | NULL |
SELECT SUM(price)
FROM items;実行結果は 30 (10 + 20) となります。
4. AVG 関数
AVG 関数は、数値型の列の平均値を計算します。SUM と同様に NULL 値は無視されます。
4.1 AVG の一般的な使用例
1. 製品の平均価格を計算する:
前の例の products テーブルを使用します。
SELECT AVG(price)
FROM products;実行結果は 323 (1615 / 5) となります。
2. 平均注文額を計算する:
order_items テーブルを使用します。
SELECT AVG(quantity * unit_price) AS average_value
FROM order_items;実行結果は 725 ((2400 + 125 + 75 + 300) / 4) となります。
3. GROUP BY と組み合わせて平均値を計算する:
student_grades(学生の成績)テーブルを例に挙げます。
| student_id (学生ID) | subject (科目) | grade (成績) |
|---|---|---|
| 1 | Mathematics (数学) | 85 |
| 1 | Physics (物理) | 90 |
| 2 | Mathematics (数学) | 75 |
| 2 | Physics (物理) | 80 |
各学生の平均成績を計算するには、以下のクエリを実行します。
SELECT student_id, AVG(grade) AS average_grade
FROM student_grades
GROUP BY student_id;実行結果は以下の通りです。
| student_id | average_grade |
|---|---|
| 1 | 87.5 |
| 2 | 77.5 |
5. MIN 関数
MIN 関数は、指定された列内の最小値を返します。数値だけでなく、文字列や日付/時刻データ型にも適用可能です。NULL 値は無視されます。
5.1 MIN の一般的な使用例
1. 最も低い製品価格を検索する:
products テーブルを使用します。
SELECT MIN(price)
FROM products;実行結果は 15 となります。
2. 最も古い注文日を検索する:
order_date(注文日)列を持つ orders テーブルがあるとします。
| order_id | order_date |
|---|---|
| 1 | 2023-01-15 |
| 2 | 2023-02-20 |
| 3 | 2023-01-01 |
最も古い注文日を検索するには、以下のクエリを使用します。
SELECT MIN(order_date)
FROM orders;実行結果は 2023-01-01 となります。
3. アルファベット順で先頭の文字列を検索する:
customer_name(顧客名)列を持つ customers テーブルがあるとします。
| customer_id | customer_name |
|---|---|
| 1 | Charlie |
| 2 | Alice |
| 3 | Bob |
SELECT MIN(customer_name)
FROM customers;実行結果は Alice となります。
6. MAX 関数
MAX 関数は、指定された列内の最大値を返します。これも数値、文字列、日付/時刻データ型に適用でき、NULL 値は無視されます。
6.1 MAX の一般的な使用例
1. 最も高い製品価格を検索する:
products テーブルを使用します。
SELECT MAX(price)
FROM products;実行結果は 1200 となります。
2. 最新の注文日を検索する:
MIN の例で使用した orders テーブルを用います。
SELECT MAX(order_date)
FROM orders;実行結果は 2023-02-20 となります。
3. アルファベット順で最後に来る製品名を検索する:
products テーブルの product_name 列を対象にします。
SELECT MAX(product_name)
FROM products;最初の products テーブルのデータに基づくと、USB Drive が返されます。文字列に対して MAX 関数を使用すると、辞書順(アルファベット順)で最後に来る値が返される点に注意してください。