PostgreSQL 入門

PostgreSQL 集約関数

集約関数(Aggregate functions)は、PostgreSQLにおいてデータの集計や分析を行うための中核的なツールです。これらを使用することで、テーブル内の複数の行にわたる計算を実行し、単一の集計結果を返すことができます。これらの関数は、データ分析、レポート生成、およびビジネス上の意思決定プロセスで広く活用されています。

膨大なデータから有益な情報を効率的に抽出するためには、集約関数の使い方をマスターすることが不可欠です。本章では、日常的な開発で最も頻繁に使用される5つの集約関数、COUNTSUMAVGMINMAXについて詳しく解説します。

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 (価格)
1Laptop (ノートパソコン)1200
2Mouse (マウス)25
3Keyboard (キーボード)75
4Monitor (モニタ)300
5USB Drive (USBメモリ)15

products テーブルの製品総数を確認するには、以下のクエリを使用します。

SELECT COUNT(*)
FROM products;

実行結果は 5 となります。

2. 特定の列の非 NULL 値をカウントする:

department(部門)列に NULL が含まれる可能性がある employees(従業員)テーブルを考えます。

employee_id (従業員ID)employee_name (従業員名)department (所属部門)
1John DoeSales (営業部)
2Jane SmithMarketing (マーケティング部)
3David LeeNULL
4Sarah BrownSales (営業部)

部門が割り当てられている(= 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 (単価)
1121200
12525
23175
241300

注文ごとの合計金額を計算するには、以下のように記述します。

SELECT order_id, SUM(quantity * unit_price) AS total_amount
FROM order_items
GROUP BY order_id;

実行結果は以下の通りです。

order_idtotal_amount
12525
2375

3. SUM における NULL 値の扱い:

列に NULL 値が含まれている場合、SUM はそれらを無視します。

item_id (項目ID)price (価格)
110
220
3NULL
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 (成績)
1Mathematics (数学)85
1Physics (物理)90
2Mathematics (数学)75
2Physics (物理)80

各学生の平均成績を計算するには、以下のクエリを実行します。

SELECT student_id, AVG(grade) AS average_grade
FROM student_grades
GROUP BY student_id;

実行結果は以下の通りです。

student_idaverage_grade
187.5
277.5

5. MIN 関数

MIN 関数は、指定された列内の最小値を返します。数値だけでなく、文字列や日付/時刻データ型にも適用可能です。NULL 値は無視されます。

5.1 MIN の一般的な使用例

1. 最も低い製品価格を検索する:

products テーブルを使用します。

SELECT MIN(price)
FROM products;

実行結果は 15 となります。

2. 最も古い注文日を検索する:

order_date(注文日)列を持つ orders テーブルがあるとします。

order_idorder_date
12023-01-15
22023-02-20
32023-01-01

最も古い注文日を検索するには、以下のクエリを使用します。

SELECT MIN(order_date)
FROM orders;

実行結果は 2023-01-01 となります。

3. アルファベット順で先頭の文字列を検索する:

customer_name(顧客名)列を持つ customers テーブルがあるとします。

customer_idcustomer_name
1Charlie
2Alice
3Bob
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 関数を使用すると、辞書順(アルファベット順)で最後に来る値が返される点に注意してください。