単一テーブルでは足りない時:なぜ結合(JOIN)が必要なのか?
前章では、単一テーブル(例えばusersテーブル)からデータを取得する方法を学びました。これはExcelでワークシートを開き、フィルタを使ってデータを探すのと同じくらい簡単です。
しかし実務の世界では、データは極めて複雑です。 大規模なECサイト(PChomeやShopeeなど)を想像してください。そのデータが全て1つのテーブルに収まるはずがありません。なぜでしょうか? 「会員名、メールアドレス、商品名、商品価格、購入数量、配送先住所」を全て1つのテーブルに記録すると、同じ会員が100回購入した場合、その会員の名前とメールアドレスが100回重複して記録されます。これはストレージの無駄遣いであるだけでなく、会員が名前を変更した場合、100件のデータを一括更新する必要があり、ミスが発生しやすくなります!
そこでリレーショナルデータベース(Relational Database)は最も偉大な設計を発明しました:データを複数のテーブルに分割し、「鍵(Key)」でそれらを関連付けるという方法です。
- 会員テーブル(users):会員基本情報を格納。各会員には一意のID(id)がある
- 商品テーブル(products):商品カタログを格納。各商品には一意のID(id)がある
- 注文テーブル(orders):これが核心!注文テーブルには会員名も商品名も「保存しない」。
user_idとproduct_idだけを保存する
「誰が何を買ったか」の完全なレポートを作成する必要がある時、データベースにこれら3つのテーブルを「結合する」よう指示する必要があります。この操作がSQLにおけるJOINです。
4つの主要なJOINパターン(暗記不要、AIがサポート)
Vibe Coding時代では構文を丸暗記する必要はありませんが、JOINの概念を理解することで、AIにより正確なPromptを指示できます。
- INNER JOIN(内部結合):最も一般的。両テーブルにデータがある場合のみ取得。「購入歴のある会員を抽出」
- LEFT JOIN(左外部結合):左テーブルを基準。右に対応データがなくても左のデータは全て表示。「全会員をリストアップし、購入があれば注文情報を、なければ注文欄を空白表示」
- RIGHT JOIN(右外部結合):LEFT JOINの逆で、右テーブルを基準
- FULL OUTER JOIN(完全外部結合):両テーブルのデータを全て取得。対応がない場合はNULLを表示
Vibe Prompt:AIに最適なJOIN構文を書かせる
テーブル関係を平易な言葉で説明するだけで、AIが瞬時にJOIN構文を作成します。
【高度な関連レポートPrompt】 以下の3テーブルがあります:
users(id, name, email)products(id, title, price)orders(id, user_id, product_id, quantity, created_at)「全ての注文明細」をリストアップするSQLを書いてください。 レポートには以下を表示:注文ID、購入会員名(name)、購入商品名(title)、購入数量(quantity)、注文総額(price * quantityをtotal_amountとして計算)。 最後に、新しい順に並べ替えてください。
AIが生成した完璧なSQL:
SELECT
o.id AS order_id,
u.name AS user_name,
p.title AS product_name,
o.quantity,
(p.price * o.quantity) AS total_amount,
o.created_at
FROM
orders o
INNER JOIN
users u ON o.user_id = u.id
INNER JOIN
products p ON o.product_id = p.id
ORDER BY
o.created_at DESC;
(見てください!AIが自動的にINNER JOINで3テーブルを結合し、総額計算式まで書いてくれました!)
グループ演算(GROUP BY)とピボット分析
テーブル結合に加え、データ分析で最もよく行うのが「集計とグループ化」です。これはExcelの「ピボットテーブル」に相当します。
例えば、上司があなたのデスクに来て「先月の商品別販売数量と総売上、最も利益が出た商品は?」と質問したとします。
Excelでピボットテーブルを作成すると時間がかかりますが、SQLの世界では**GROUP BY(グループ化)と集計関数(SUM, COUNT, AVGなど)**で簡単に解決できます。
Vibe Prompt:瞬時にビジネスレポートを生成
【商品売上分析Prompt】 先程の
ordersとproducts構造に基づき、SQLを書いてください。 「商品ごと」の「総販売数量」と「総売上」を集計してください。 総売上高い順に並べ替え、最も収益性の高い商品が一目で分かるようにしてください。
AIが生成した優れたレポートSQL:
SELECT
p.title AS product_name,
SUM(o.quantity) AS total_sold_quantity,
SUM(p.price * o.quantity) AS total_revenue
FROM
products p
LEFT JOIN
orders o ON p.id = o.product_id
GROUP BY
p.id, p.title
ORDER BY
total_revenue DESC NULLS LAST;
SupabaseのSQL Editorでこのコードを実行すると、非常に見やすいレポートが得られます:
- 人間工学AIチェア | 販売数5 | 総売上60000
- Vibeプレミアムメカニカルキーボード | 販売数12 | 総売上42000
Vibe CodingとSQLの強力な組み合わせにより、何十万件ものデータに圧倒される心配はもうありません。質問の仕方さえ分かれば、AIが明確に答えを計算してくれます!次章では、より高度な課題「データベースでユーザーパスワードを保護する方法」に挑戦します!