データベースのクエリを最適化する方法の一つに「サブクエリをJOINで使う」という手法があります。サブクエリ(副問合せ)は、SELECT文の中で別のSELECT文を使うことを指します。今回は、サブクエリをJOINに組み込む方法について、初心者にも分かりやすいように解説していきます。
まず、シンプルな2つのテーブルを用意します。
employees
(従業員テーブル)
id | name | department_id |
---|---|---|
1 | 田中 | 1 |
2 | 鈴木 | 2 |
3 | 佐藤 | 1 |
4 | 山本 | 3 |
5 | 高橋 | 2 |
departments
(部署テーブル)
id | department_name |
---|---|
1 | 営業部 |
2 | 開発部 |
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 |
部署名もなんとか取得しないといけませんね。
部署名を取得するには、上記のサブクエリの結果と
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 |
サブクエリをJOINに組み込むことで、データを整理しながら取得することができます。今回は、部署ごとの従業員数を取得する例を通じて、サブクエリの使い方とJOINの利点を学びました。
この技術を活用することで、より柔軟で効率的なSQLの書き方を習得しましょう!
以下の売上データをもとに、各顧客の合計購入金額を計算し、顧客名とともに表示する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 |