サブクエリとは?
サブクエリとは、SQL文の中に別のSELECT文を組み込むことを指します。
この内側のSELECT文をサブクエリ、外側のSELECT文をメインクエリと呼びます。
サブクエリは、メインクエリのWHERE句、FROM句、HAVING句など、様々な場所で利用できます。
サブクエリの活用例
1. WHERE句での利用
- 特定の条件を満たすデータの抽出
SELECT *
FROM products
WHERE price > (
SELECT AVG(price)
FROM products
);
平均価格よりも高い商品を抽出します。
- IN演算子との組み合わせ
SELECT *
FROM orders
WHERE customer_id IN (
SELECT customer_id
FROM customers
WHERE city = '東京'
);
東京在住の顧客の注文情報を抽出します。
2. FROM句での利用
- サブクエリの結果を仮想テーブルとして扱う
SELECT *
FROM (
SELECT customer_id, SUM(amount) AS total_amount
FROM orders
GROUP BY customer_id
) AS customer_totals
WHERE total_amount > 10000;
顧客ごとの合計注文金額を計算し、1万円を超える顧客を抽出します。
3. HAVING句での利用
- グループ化されたデータに対する条件
SELECT department, AVG(salary)
FROM employees
GROUP BY department HAVING AVG(salary) > (
SELECT AVG(salary)
FROM employees
);
各部署の平均給与が全社員の平均給与を超える部署を抽出します。
サブクエリの注意点とコツ
- 実行順序
サブクエリはメインクエリよりも先に実行されます。 - 相関サブクエリ
メインクエリのテーブルとサブクエリのテーブルが関連付けられる場合、相関サブクエリと呼ばれます。 - パフォーマンス
サブクエリは複雑になるほど実行時間が遅くなる可能性があります。インデックスの作成や、JOINの使用を検討しましょう。 - EXISTS演算子
あるレコードが存在するかどうかの判定に便利です。 - NOT EXISTS演算子
あるレコードが存在しない場合の判定に便利です。
実践的な活用例
- ランキングの抽出: 売上高上位10件の顧客を抽出
- 異常値の検出: 平均値から大きく外れたデータの抽出
- 関連データの抽出: ある商品を購入した顧客が他にどのような商品を購入しているか
- 複雑な条件での抽出: 複数の条件を組み合わせた抽出
サブクエリのメリット
- 柔軟なデータ抽出: 複雑な条件でのデータ抽出が可能
- 再利用性: サブクエリをビューとして定義することで、他のSQL文で再利用可能
- 可読性の向上: 複雑なロジックを分割して記述できる
まとめ
サブクエリは、SQLの表現力を飛躍的に向上させる強力なツールです。しかし、複雑なサブクエリはパフォーマンスに影響を与える可能性があるため、適切な使い方を心がけましょう。
さらに詳しく学びたい方へ
- 相関サブクエリ: メインクエリとサブクエリの関連付け方
- 共通テーブル式(CTE): サブクエリを一時的なビューとして定義する
- ウィンドウ関数: グループ内の行に対する計算を行う
練習問題
- productsテーブルから、価格が平均価格の1.5倍以上の商品を抽出してください。
- customersテーブルから、東京都に住む顧客が注文した商品の種類を全て抽出してください。
- employeesテーブルから、各部署の平均給与が会社全体の平均給与を上回る部署と、その平均給与を表示してください。
コメント