SQLの主問合せと副問合せで実現する高度なデータ抽出の技法

SQLの主問合せと副問合せの基本から応用まで、実践的なコード例を交えて解説します。複雑なデータ抽出をシンプルに実現できる副問合せ、どのように活用すればよいのでしょうか?

SQLにおける主問合せと副問合せの基礎と実践

副問合せの3つの特徴
🔍
入れ子構造

SQL文の中に別のSELECT文を含める形式で、複雑な条件を1つのクエリで表現可能

📊
実行順序

副問合せが先に実行され、その結果を使って主問合せが処理される

柔軟な使用場所

SELECT句、FROM句、WHERE句、HAVING句で使用可能

SQLの副問合せの基本構文と動作原理

副問合せは、SQL文の中に別のSELECT文を含める形で記述します。基本的な構文は以下のようになります:


SELECT カラム名
FROM テーブル名
WHERE カラム名 演算子 (SELECT カラム名 FROM テーブル名 [WHERE 条件式])

 

この構文では、括弧内のSELECT文(副問合せ)が先に実行され、その結果を使って外側のSELECT文(主問合せ)が実行されます。

SQLの単一行副問合せの実装テクニック

単一行副問合せは、1つの値のみを返す副問合せです。以下のような場合に使用します:


SELECT name, score
FROM students
WHERE score > (SELECT AVG(score) FROM students)

 

このクエリでは、全体の平均点より高い点数を取った生徒を抽出しています。

 

比較演算子として使用できるものは:

  • =(等しい)
  • >(より大きい)
  • <(より小さい)
  • >=(以上)
  • <=(以下)
  • <>(等しくない)

SQLの複数行副問合せの活用方法

複数行副問合せでは、複数の値を返す副問合せに対して特別な演算子を使用します:


SELECT department_name
FROM departments
WHERE department_id IN (
    SELECT department_id 
    FROM employees 
    WHERE salary > 10000
)

 

主な演算子:

  • IN:リストの中のいずれかの値と一致
  • ANY:いずれかの値と条件が成立
  • ALL:すべての値と条件が成立
  • EXISTS:結果が存在するかどうかを確認

SQLの相関副問合せによるデータ分析

相関副問合せは、主問合せと副問合せが相互に関連する形式です:


SELECT e1.employee_name, e1.salary
FROM employees e1
WHERE salary > (
    SELECT AVG(salary)
    FROM employees e2
    WHERE e2.department_id = e1.department_id
)

 

この例では、各従業員の給与を、その従業員が所属する部門の平均給与と比較しています。

SQLの副問合せによるパフォーマンス最適化

副問合せを効率的に使用するためのポイント:

  • インデックスの適切な設定
  • 不要な相関副問合せの回避
  • 可能な場合はJOINの使用を検討
  • 実行計画の確認と分析

-- 非効率な例
SELECT *
FROM orders o
WHERE customer_id IN (
    SELECT customer_id
    FROM customers
    WHERE country = 'Japan'
)
-- 効率的な例
SELECT o.*
FROM orders o
JOIN customers c ON o.customer_id = c.customer_id
WHERE c.country = 'Japan'

 

これらの最適化により、クエリのパフォーマンスを大幅に向上させることができます。