SQLのテーブル結合とサブクエリーの実践的な使い方と応用例

SQLのテーブル結合について、基本から応用まで実践的なコード例を交えて解説します。複数テーブルの効率的な結合方法や、実務でよく使うパターンとは?

SQLのテーブル結合の基礎と実践的な使い方

テーブル結合の基本
📊
データの関連付け

複数のテーブルを結合して必要な情報を取得します

🔄
結合の種類

INNER JOIN、OUTER JOIN、CROSS JOINなど目的に応じて使い分けます

パフォーマンス

適切な結合方法を選択することでクエリの実行効率が向上します

SQLの内部結合(INNER JOIN)の基本と実装方法

内部結合は最も基本的な結合方法で、両方のテーブルに存在するデータのみを取得します。以下のような実装が一般的です。


SELECT e.employee_name, d.department_name
FROM employees e
INNER JOIN departments d
ON e.department_id = d.department_id

 

このクエリでは、社員テーブルと部署テーブルを部署IDで結合しています。結合条件に一致しないデータは除外されます。

SQLの外部結合(OUTER JOIN)でデータを漏れなく取得

外部結合には LEFT、RIGHT、FULL の3種類があり、片方のテーブルにデータがない場合でも結果を取得できます。


SELECT s.student_id, s.name, c.club_name
FROM students s
LEFT OUTER JOIN clubs c
ON s.club_id = c.club_id

 

部活動に所属していない学生も含めて全員の情報を取得したい場合などに使用します。

SQLのクロス結合(CROSS JOIN)とパフォーマンス最適化

クロス結合は両テーブルの全ての組み合わせを生成します。


SELECT p.product_name, s.size, c.color
FROM products p
CROSS JOIN sizes s
CROSS JOIN colors c

 

商品の全サイズと色の組み合わせを生成する際などに使用しますが、データ量が多い場合はパフォーマンスに注意が必要です。

SQLのサブクエリを使った高度な結合テクニック

サブクエリを使用することで、より複雑な条件での結合が可能になります。


SELECT e.employee_name,
       (SELECT d.department_name 
        FROM departments d 
        WHERE d.department_id = e.department_id) as dept_name
FROM employees e
WHERE e.salary > (
    SELECT AVG(salary)
    FROM employees
    WHERE department_id = e.department_id
)

 

部署ごとの平均給与より高い給与の社員を抽出する例です。

SQLの結合における実務的なパフォーマンスチューニング

結合を使用する際は、以下の点に注意してパフォーマンスを最適化します:

  1. インデックスの活用
  • 結合キーとなるカラムにはインデックスを作成
  • 複合インデックスの検討
  1. 結合順序の最適化
  • 小さいテーブルを先に結合
  • 中間結果のサイズを考慮
  1. 実行プランの確認
  • EXPLAIN コマンドで実行計画を確認
  • 不要な結合の排除

-- インデックスを使用した効率的な結合
CREATE INDEX idx_department_id ON employees(department_id)
CREATE INDEX idx_department_id ON departments(department_id)
SELECT /*+ INDEX(e idx_department_id) */
       e.employee_name,
       d.department_name
FROM employees e
INNER JOIN departments d
ON e.department_id = d.department_id

 

結合条件の選択とインデックスの適切な設定により、クエリのパフォーマンスを大幅に改善できます。