こんにちは!
35歳、未経験からWebの世界に飛び込んだ者です。
今回は、SQL最大の難所の一つ「JOIN(結合)」を、
「カフェのスタンプカード」に例えて、わかりやすく解説します!
JOINとは
JOINとは: バラバラに保存されたデータを、共通の「合言葉(ID)」でガッチャンコすること!
内部結合(INNER): 両方のテーブルにデータがある「共通」だけを出す。
外部結合(OUTER): 片方にしかデータがなくても「無理やり」出す。
1. なぜわざわざ「結合」なんて面倒なことをするの?
そもそも、1つの大きな表に全部書けば楽じゃないですか?
自分も学び始めはそう思いました。
しかし例えば、「いつ、誰が、何を買ったか」を1つの表にすると、同じ人の名前や住所を何度も書く羽目になります。
これだと、その人が引っ越した時に100箇所くらい修正が必要になり、絶望します。
だから、データベース界では「管理はバラバラに、見る時だけ合体!」が鉄則なんです。
例:カフェの運営
お客様名簿(顧客テーブル): 会員番号、名前、住所。
注文履歴(注文テーブル): 注文ID、会員番号、頼んだコーヒー。
会員番号(ID)さえ共通していれば、お会計の時に「名簿」から名前を引っ張ってこれますよね。
これがJOINの正体です。
2. 内部結合(INNER JOIN)は「超シビアな受付」
まずは、一番よく使う INNER JOIN です。
これは、「共通のIDが両方のテーブルに存在する場合のみ」合体させます。
具体例: 「今日来店して、スタンプカード(名簿)をちゃんと持っている人」だけのリストを作るようなものです。
結果: カードを持っていない新規客や、カードは作ったけど一度も来ていない幽霊会員は容赦なく除外されます。
-- 内部結合のイメージ
SELECT 名前, 商品名
FROM 顧客テーブル
INNER JOIN 注文テーブル
ON 顧客テーブル.会員ID = 注文テーブル.会員ID;
3. 外部結合(LEFT JOIN)は「お節介な名簿係」
次に迷うのが LEFT JOIN(左外部結合)です。
これは、「左側(最初)に書いたテーブルのデータは全部出す!相手がいなくても出す!」というスタイルです。
具体例: 「全会員のリスト」を作りたい時。
結果: 今日お店に来ていない人でも、名簿に名前があれば表示します。その代わり、注文欄は「NULL(注文なし)」というスカスカな状態になります。
💡 日常の例え:
出席を取る先生をイメージしてください。
「名簿に名前があるけど、教室にいない(注文がない)生徒」も、欠席としてリストには載せますよね。それがLEFT JOINです。
図で見る「結合」のビジュアル
【顧客テーブル】 【注文テーブル】
ID | 名前 ID | 顧客ID | 商品
---|------ ---|--------|------
1 | 佐藤 1 | 1 | カフェラテ
2 | 鈴木 2 | 1 | サンドイッチ
3 | 高橋 (3番の注文はまだ無い)
👇 INNER JOIN(両方にデータがある「佐藤さん」だけ!)
名前 | 商品
------|-------
佐藤 | カフェラテ
佐藤 | サンドイッチ
👇 LEFT JOIN(注文がない「鈴木さん」「高橋さん」も捨てない!)
名前 | 商品
------|-------
佐藤 | カフェラテ
佐藤 | サンドイッチ
鈴木 | NULL <-- お店に来てないけど名簿にはいる!
高橋 | NULL <-- 同上
まとめ
INNER JOIN は「一致するものだけ」の厳格スタイル。
LEFT JOIN は「左側のテーブルは絶対守る」お節介スタイル。
一致しない右側は NULL になる。
これが分かれば、もう「結合したらデータが消えた!」と慌てることはありません!
さあ、これであなたもJOINマスターへの第一歩を踏み出しました。
SQL学習、一緒に楽しんでいきましょう!
PRUMのエンジニアの95%以上は未経験からの採用です。
よければコーポレートサイトにも遊びに来てください。
コーポレートサイト
エンジニアの方に役立つ記事をまとめたサイトも運営しています。もしご興味あれば覗いてみてくださいね。
エンジニアに役立つ記事サイト