SQL初心者向けチュートリアル – テーブルの結合:INNER JOINとLEFT JOINの比較

SQL

CROSS JOIN、INNER JOIN、LEFT JOINの違いについて、それぞれ具体例を用いて説明します。

以前、CRUDについて解説した記事にて、booksとbook_salesテーブルを用いました。本記事はその続きであり、2つのテーブルを例に解説していきます。

 

SQL初心者向けチュートリアル - CRUDの基本とWHERE
SQLとは何かまた、SQLクエリの基本操作について解説していきます。MySQLを使う前提で解説していきますが、SQLは基本的に他のRDB(リレーショナルデータベース)でもそのまま使うことができます。SQLにおける基本CRUD(Create、Read、Update、Delete)とWHERE句について紹介いたします。

 

CROSS JOIN(クロス結合)

CROSS JOINは、2つのテーブルのすべての行を結合し、結合結果がテーブルAの各行とテーブルBの各行の組み合わせを生成します。これは非常に効率的でない結合方法であり、使用する際には注意が必要です。以下は具体例です。

-- 例: CROSS JOINの使用
SELECT * FROM books b CROSS JOIN book_sales bs;

このクエリは、booksテーブルのすべての本とbook_salesテーブルのすべての売上の組み合わせを生成します。結果セットは、本と売上のすべての組み合わせを含む巨大なテーブルとなります。

 

CROSS JOINの注意点:

  1. パフォーマンスの問題: CROSS JOINは非常に効率が悪く、データベースの性能に悪影響を及ぼす可能性があります。大きなテーブルをCROSS JOINすると、結果セットが爆発的に大きくなり、クエリの実行時間が長くなることがあります。
  2. データの過剰取得: CROSS JOINは、不要なデータを多く取得する可能性があります。結合結果には、無関係なデータも含まれるため、データのフィルタリングが重要です。

 

動画でもCROSS、LEFT、INNER JOINについて、それぞれテーブル結合のイメージが持てるように簡単に解説しています。(MySQL以外のRDBでも基本的に同じ考え方です)

INNER JOIN(内部結合)

INNER JOINは、2つのテーブル間で共通の値を持つ行のみを結合します。これはよく使用される結合方法で、特定の条件に基づいてデータを結合します。以下は具体例です

-- 例: INNER JOINの使用
SELECT * FROM books b 
INNER JOIN  book_sales bs
on b.id = bs.book_id;

このクエリは、booksテーブルのidとbook_salesテーブルのbook_idカラムを使用して内部結合し、本とその売上を結合します。結果セットには、共通のbook_idを持つ本と売上の組み合わせが含まれます。

 

INNER JOINの魅力:

  1. データの統合: INNER JOINを使用することで、異なるテーブルからの情報を統合し、関連性のあるデータを取得できます。この統合されたデータは分析、レポート、ビジネスの意思決定に活用できます。
  2. データの精度: INNER JOINは共通の値を持つデータのみを結合するため、結果は高いデータ精度を持ちます。不要なデータは結果セットに含まれないため、不要な情報の混乱が生じません。
  3. 柔軟性: INNER JOINは条件に基づいてデータを結合できるため、必要なデータのフィルタリングや絞り込みが可能です。これにより、特定の条件を満たすデータの取得が容易になります。
  4. クエリの効率性: INNER JOINは多くのデータベースシステムで効率的に動作し、迅速なクエリ実行をサポートします。データベースエンジンはINNER JOINを最適化しやすく、高速な結果を提供します。

 

LEFT JOIN(外部結合)

LEFT JOINは、左側のテーブル(主テーブル)のすべての行を保持し、右側のテーブル(結合テーブル)と共通の値を持つ行があれば結合します。右側のテーブルに該当するデータがない場合でも、左側のテーブルの行は結果に表示されます。以下は具体例です。

-- 例: LEFT JOINの使用
SELECT * FROM books b 
LEFT JOIN book_sales bs 
on b.id = bs.book_id;

このクエリは、booksテーブルのidとbook_salesテーブルのbook_idカラムを使用して左結合し、本とその売上を結合します。結果セットには、すべての本とその売上が含まれますが、売上のない本の場合、売上情報はNULLになります。

これらの具体例を通じて、CROSS JOIN、INNER JOIN、LEFT JOINの違いが明確になります。適切な結合方法を選択することは、データベースクエリの効率性と結果の正確性に影響を与えます。

 

LEFT JOINの優れた柔軟性:

  1. 全体像の把握: LEFT JOINは、データベース内のデータの全体像を把握するのに役立ちます。全ての主要なデータを取得しつつ、関連性がないデータも捨てないため、結果セットは包括的になります。
  2. 欠損データ処理: LEFT JOINは、欠損データや関連性のないデータを処理するのに適しています。データベース内でデータの不連続性がある場合、LEFT JOINを使用して重要なデータを取得できます。
  3. 柔軟なクエリ: LEFT JOINはデータのフィルタリングと絞り込みにも適しています。必要なデータを抽出するために条件を追加できます。
  4. 結合の組み合わせ: LEFT JOINは他のJOINタイプと組み合わせて使用できます。複雑なデータ取得要件に対応できます。

 

INNER JOIN vs LEFT JOIN

では、実際にどちらを使用すればいいのかというとビジネス用途、要件によって変わってきます。

INNER JOIN: 両方のテーブルにデータが存在し、関連性のあるデータを取得する場合に適しています。データの整合性が重要な場合に使用します。

LEFT JOIN: 左側のテーブルのデータを保持しつつ、関連性がないデータも取得できるため、欠損データの処理や全体像の把握に適しています。データの欠損や不連続性を許容する場合に使用します。