サブクエリをJOINで使う

1. はじめに

データベースのクエリを最適化する方法の一つに「サブクエリをJOINで使う」という手法があります。サブクエリ(副問合せ)は、SELECT文の中で別のSELECT文を使うことを指します。今回は、サブクエリをJOINに組み込む方法について、初心者にも分かりやすいように解説していきます。

2. サンプルテーブル

まず、シンプルな2つのテーブルを用意します。

employees(従業員テーブル)

id name department_id
1 田中 1
2 鈴木 2
3 佐藤 1
4 山本 3
5 高橋 2

departments(部署テーブル)

id department_name
1 営業部
2 開発部
3 人事部

3. サブクエリを使った例

例えば、各部署に所属する従業員の数を取得し、部署名と一緒に表示する場合を考えます。まず、サブクエリを使って各部署の従業員数を取得します。

サブクエリで従業員数を取得

SELECT department_id, COUNT(*) AS employee_count
FROM employees
GROUP BY department_id;

このクエリの結果は次のようになります。 このクエリだけではGROUP BY句の特性のため、部署名(department_name)が取得できないことに注目してください。 サブクエリをJOINに組み込む必要があります。

department_id employee_count
1 2
2 2
3 1

4. サブクエリをJOINに組み込む

部署名もなんとか取得しないといけませんね。 部署名を取得するには、上記のサブクエリの結果departmentsテーブルとJOINさせて、部署名と従業員数を組み合わせたデータを取得します。

このJOINは「012 テーブル結合 | LEFT JOINの基本と活用」の回で学んだものと同じものです。 その回では2つのテーブルをJOIN(連結)しましたが、今回はdepartmentsテーブルとサブクエリの結果をJOINします。

SELECT d.department_name, sub.employee_count
FROM departments d
JOIN (
    SELECT department_id, COUNT(*) AS employee_count
    FROM employees
    GROUP BY department_id
) sub
ON d.id = sub.department_id;

このクエリの結果は次のようになります。部署名もできていますね。

department_name employee_count
営業部 2
開発部 2
人事部 1

5. サブクエリをJOINで使うメリット

6. まとめ

サブクエリをJOINに組み込むことで、データを整理しながら取得することができます。今回は、部署ごとの従業員数を取得する例を通じて、サブクエリの使い方とJOINの利点を学びました。

この技術を活用することで、より柔軟で効率的なSQLの書き方を習得しましょう!

7. 練習問題

以下の売上データをもとに、各顧客の合計購入金額を計算し、顧客名とともに表示するSQLを完成させてください。

ヒント:各顧客の合計購入金額を取得するSQLです。でもこのSQLだけでは顧客名まで取得できません。

    SELECT customer_id, SUM(amount) AS total_amount
    FROM sales
    GROUP BY customer_id

sales(売上テーブル)

id customer_id amount
1 101 5000
2 102 7000
3 101 2000
4 103 8000
5 102 3000

customers(顧客テーブル)

id name
101 佐藤
102 鈴木
103 田中

期待する結果

name total_amount
佐藤 7000
鈴木 10000
田中 8000

SQLを完成させてください

SELECT c.name, sub.total_amount
FROM customers c
JOIN (
    SELECT customer_id, SUM(amount) AS total_amount
    FROM sales
    GROUP BY customer_id
) sub
ON c.id = sub.customer_id;