SQL JOINの理解:ビジュアルガイド
Olivia Novak
Dev Intern · Leapcell

SQL JOINの紹介
リレーショナルデータベースの世界では、正規化された設計を実現し、冗長性を削減し、データ整合性を向上させるために、データはしばしば複数のテーブルに編成されます。この構造はストレージには非常に効率的ですが、これらの別個のテーブルにまたがる情報を取得して分析する必要があるシナリオは数え切れないほどあります。そこで、SQL JOIN操作が不可欠になります。JOINはリレーショナルデータベースクエリの基盤であり、2つ以上のテーブルの行をそれらの間の関連列に基づいてインテリジェントに結合できるようにします。JOINについての確固たる理解なしには、複雑なデータセットから意味のある洞察を抽出することは、不可能ではないにしても、非常に困難な作業となるでしょう。このガイドでは、最も一般的なSQL JOINの種類であるINNER JOIN、LEFT JOIN、FULL OUTER JOIN、CROSS JOINを視覚的に案内し、それぞれの動作を明確にし、いつ、どのように効果的に使用するかを示します。
JOINを理解するためのコアコンセプト
各JOINタイプの詳細に入る前に、このガイド全体で使用するいくつかの基本用語を定義しましょう。
- テーブル (Table): 行と列で構成される構造化されたデータセット。特定の種類の情報(例:
Customers、Orders)を保持するように設計されています。 - 行 (Row/Record): テーブル内の単一のエントリ。特定のエンティティに関連する完全なデータセットを表します。
- 列 (Column/Field): テーブル内の各エントリの特定の属性または情報(例:
customer_id、order_date)。 - 主キー (Primary Key/PK): テーブル内の各行を一意に識別する1つ以上の列。NULL値を含めることはできず、一意でなければなりません。
- 外部キー (Foreign Key/FK): あるテーブル内の1つ以上の列で、別のテーブルの主キーを参照します。外部キーは、2つのテーブルのデータ間のリンクを確立および強制します。
- JOIN条件 (Join Condition): 通常
ONの後に続く句で、2つのテーブルがどのように関連付けられるかを指定します。通常は、一方のテーブルの外部キーをもう一方のテーブルの主キーに一致させます。
例では、2つのシンプルなテーブル Customers と Orders を使用します。
Customers テーブル:
| customer_id | customer_name |
|---|---|
| 1 | Alice |
| 2 | Bob |
| 3 | Charlie |
| 4 | David |
Orders テーブル:
| order_id | customer_id | order_date | amount |
|---|---|---|---|
| 101 | 1 | 2023-01-05 | 150.00 |
| 102 | 2 | 2023-01-06 | 200.00 |
| 103 | 1 | 2023-01-07 | 50.00 |
| 104 | 5 | 2023-01-08 | 300.00 |
| 105 | 2 | 2023-01-09 | 75.00 |
| 106 | NULL | 2023-01-10 | 120.00 |
customer_id は Customers テーブルの主キーであり、Orders テーブルの外部キーであることに注意してください。ID 5 の存在しない顧客からの注文 (104) と、NULL の顧客 ID を持つ注文 (106) があります。これは、異なる JOIN の動作を説明するのに役立ちます。
INNER JOIN:共通部分
INNER JOIN は最も一般的な JOIN タイプです。指定された JOIN 条件に基づいて、両方 のテーブルに一致する値を持つ行のみを返します。これは、2つのセットの共通部分を見つけると考えることができます。一方のテーブルの行がもう一方のテーブルに対応する一致を持たない場合、結果から除外されます。
視覚的表現:
2つの重なり合う円を想像してください。INNER JOIN は、それらが重なり合っている領域を返します。
Customers
+-----------+
| Alice |
| Bob | (Overlap)
| Charlie | <--- INNER JOIN result
| David |
+-----------+
+-----------+
| Order 1 |
| Order 2 |
| Order 3 |
| Order 4 |
| Order 5 |
+-----------+
Orders
SQL 例:
SELECT C.customer_id, C.customer_name, O.order_id, O.order_date, O.amount FROM Customers C INNER JOIN Orders O ON C.customer_id = O.customer_id;
結果:
| customer_id | customer_name | order_id | order_date | amount |
|---|---|---|---|---|
| 1 | Alice | 101 | 2023-01-05 | 150.00 |
| 2 | Bob | 102 | 2023-01-06 | 200.00 |
| 1 | Alice | 103 | 2023-01-07 | 50.00 |
| 2 | Bob | 105 | 2023-01-09 | 75.00 |
説明:
- 顧客「Alice」(ID 1)は2つの注文(101、103)を持っているため、両方が表示されます。
- 顧客「Bob」(ID 2)は2つの注文(102、105)を持っているため、両方が表示されます。
- 顧客「Charlie」(ID 3)と「David」(ID 4)には一致する注文がないため、除外されます。
- 注文 104(顧客 ID 5)と注文 106(NULL 顧客 ID)には一致する顧客がないため、除外されます。
ユースケース: 顧客の詳細とその行われた注文を取得する。
LEFT JOIN(または LEFT OUTER JOIN):左側はすべて、右側は一致するもの
A LEFT JOIN(LEFT OUTER JOIN としても知られています)は、左側 のテーブルのすべての行と、右側のテーブルの一致する行を返します。左側のテーブルの行に対応する一致がない場合、右側のテーブルの列には NULL 値が含まれます。
視覚的表現: 左側の円全体と、右側の円の重なり部分を想像してください。
Customers
+-----------+
| Alice |
| Bob | <--- LEFT JOIN result
| Charlie |
| David |
+-----------+
+-----------+
| Order 1 |
| Order 2 |
| Order 3 |
| Order 4 |
| Order 5 |
+-----------+
Orders
SQL 例:
SELECT C.customer_id, C.customer_name, O.order_id, O.order_date, O.amount FROM Customers C LEFT JOIN Orders O ON C.customer_id = O.customer_id;
結果:
| customer_id | customer_name | order_id | order_date | amount |
|---|---|---|---|---|
| 1 | Alice | 101 | 2023-01-05 | 150.00 |
| 1 | Alice | 103 | 2023-01-07 | 50.00 |
| 2 | Bob | 102 | 2023-01-06 | 200.00 |
| 2 | Bob | 105 | 2023-01-09 | 75.00 |
| 3 | Charlie | NULL | NULL | NULL |
| 4 | David | NULL | NULL | NULL |
説明:
- すべての顧客(Alice、Bob、Charlie、David)が含まれます。
- 注文がない顧客「Charlie」(ID 3)と「David」(ID 4)の場合、
Orders列にはNULL値が表示されます。 - 注文 104 と 106 は、
Customersテーブルに一致するcustomer_idがなく、Customersが左側のテーブルであるため、含まれていません。
ユースケース: 注文を行ったかどうかにかかわらず、すべての顧客と、彼らが注文した可能性のある注文を取得します。これは、非アクティブな顧客を特定するのに役立ちます。
FULL OUTER JOIN(または OUTER JOIN):両方からすべて
A FULL OUTER JOIN(一部の SQL 方言では単に OUTER JOIN ですが、FULL OUTER JOIN が標準です)は、左側または右側のテーブルのいずれかに一致がある場合にすべての行を返します。一致がない場合、一致しない側には NULL 値が含まれます。この JOIN は、LEFT JOIN と RIGHT JOIN の結果を効果的に結合します。
視覚的表現: 両方の円全体を含め、重なり合う部分が一度表示されるのを想像してください。
Customers
+-----------+
| Alice |
| Bob |
| Charlie | <--- FULL OUTER JOIN result
| David |
+-----------+
+-----------+
| Order 1 |
| Order 2 |
| Order 3 |
| Order 4 |
| Order 5 |
+-----------+
Orders
SQL 例:
SELECT C.customer_id, C.customer_name, O.order_id, O.order_date, O.amount FROM Customers C FULL OUTER JOIN Orders O ON C.customer_id = O.customer_id;
結果:
| customer_id | customer_name | order_id | order_date | amount |
|---|---|---|---|---|
| 1 | Alice | 101 | 2023-01-05 | 150.00 |
| 1 | Alice | 103 | 2023-01-07 | 50.00 |
| 2 | Bob | 102 | 2023-01-06 | 200.00 |
| 2 | Bob | 105 | 2023-01-09 | 75.00 |
| 3 | Charlie | NULL | NULL | NULL |
| 4 | David | NULL | NULL | NULL |
| NULL | NULL | 104 | 2023-01-08 | 300.00 |
| NULL | NULL | 106 | 2023-01-10 | 120.00 |
説明:
- すべての顧客(Alice、Bob、Charlie、David)が含まれます。
- 注文 101、102、103、105 は、それぞれ対応する顧客と一致します。
CharlieとDavidは、注文がないため、注文情報がNULLです。- 注文 104(顧客 ID 5、
Customersになし)と注文 106(NULL 顧客 ID)は含まれますが、一致する顧客がないため、Customers列はNULLです。
ユースケース: 両方のテーブルからのすべてのデータを表示し、潜在的なデータ不整合(例:顧客のない注文、注文のない顧客)を強調したい場合に役立ちます。
CROSS JOIN:デカルト積
A CROSS JOIN は、2つのテーブルのデカルト積を返します。これは、最初のテーブルの各行が2番目のテーブルの各行と結合されることを意味します。CROSS JOIN には JOIN 条件は指定されません。
視覚的表現: 2つの円が横並びになっており、最初の円のすべての点から2番目の円のすべての点への線が接続されているのを想像してください。
Customers Orders
+-----------+ +-----------+
| Alice | | Order 1 |
| Bob | | Order 2 |
| Charlie | | Order 3 |
| David | | Order 4 |
+-----------+ | Order 5 |
+-----------+
(すべての顧客行がすべての注文行と結合される)
SQL 例:
SELECT C.customer_id, C.customer_name, O.order_id, O.order_date, O.amount FROM Customers C CROSS JOIN Orders O;
結果 (一部 - 合計 4 人の顧客 * 6 件の注文 = 24 行):
| customer_id | customer_name | order_id | order_date | amount |
|---|---|---|---|---|
| 1 | Alice | 101 | 2023-01-05 | 150.00 |
| 1 | Alice | 102 | 2023-01-06 | 200.00 |
| 1 | Alice | 103 | 2023-01-07 | 50.00 |
| ... | ... | ... | ... | ... |
| 4 | David | 104 | 2023-01-08 | 300.00 |
| 4 | David | 105 | 2023-01-09 | 75.00 |
| 4 | David | 106 | 2023-01-10 | 120.00 |
説明:
- 4 人の顧客それぞれが、6 件の注文それぞれと組み合わされ、合計 24 行の結果が生成されます。
- 例えば、「Alice」は注文 101 とペアになり、次に注文 102、注文 103、そして 6 件すべての注文とペアになります。これは Bob、Charlie、David についても繰り返されます。
ユースケース: CROSS JOIN は、結果セットが非常に大きくなる可能性があるため、一般的なデータ取得ではあまり使用されません。主な用途は次のとおりです。
- データの2つのセット間で可能なすべての組み合わせを生成する(例:すべての可能な日付とすべての可能な時間枠を組み合わせたカレンダーの作成)。
- 大規模なデータセットをシミュレートする必要があるテスト目的。
- 特定の統計分析(例:合計に対する割合の計算)を達成するために、他の句と組み合わせて使用されることがあります。
結論
SQL JOIN はリレーショナルデータベースクエリのバックボーンであり、別個のデータを意味のある結果に統合するための強力なメカニズムを提供します。INNER JOIN は共通の領域を提供し、LEFT JOIN は左側のテーブルを優先し、FULL OUTER JOIN は両方からのすべてを網羅し、CROSS JOIN は可能なすべてのペアを生成します。これらの違いを理解し、いつ適用するかを理解することは、リレーショナルデータベースを扱う人にとって不可欠であり、データの潜在能力を最大限に引き出す、正確で効率的なクエリを作成できるようにします。これらの JOIN をマスターすれば、最も複雑なデータベーススキーマからでも、複雑なパターンと洞察を抽出することをマスターできます。