適切なJOINの種類を選ぶ
文章問題から正しいJOINを選ぶための判断方法を学びます。
「適切なJOINの種類を選ぶ」はCoddyKit上の無料SQL Interview Prepレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Interview Prep学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Interview Prepコースには全4レッスンが含まれています。
文章題から結合を選ぶ
面接で最も価値のある結合スキルは、構文ではなく、平易な英語の要件を正しい結合の種類に変換することです。多くの候補者は各結合の仕組みを知っていますが、プレッシャーの中で1つを選ばなければならないと、判断できなくなります。
このレッスンでは、適切な結合を数秒で選べるように、繰り返し使える判断フレームワークを紹介します。
核心となる質問:どの行を残す必要があるか
結合の選択は、結局のところ次の1つの質問に集約されます。どちら側の一致しない行を残す必要があるかです。
- 両側で一致した行だけを残す:
INNER JOIN。 - 一致するかどうかにかかわらず、左側のすべての行を残す:
LEFT JOIN。 - 両側のすべての行を残す:
FULL OUTER JOIN。 - すべての組み合わせを残す:
CROSS JOIN。
まず残す必要がある行を決めれば、結合の種類は自動的に決まります。
INNER JOINを示す手がかり
「注文をした顧客」、「レビューがある商品」、「顧客と一緒に表示する注文」のような表現は、両側に一致する行が存在する必要があることを示します。これはINNER JOINです。
一致しない行を除外しても問題ない、または除外したい場合は、INNER JOINが基本であり、最も効率的な選択です。
SELECT c.name, o.order_id
FROM customers c
JOIN orders o ON o.customer_id = c.id;LEFT JOINを示す手がかり
「注文がない顧客も含む、すべての顧客」や「すべての商品とそのレビュー数(なければ0)を一覧にする」のような表現は、一致する行がなくても左テーブルを保持する必要があることを意味します。これはLEFT JOINです。
決め手となる語は、「すべて」、「該当しないものも含む」、「1件もなくても」です。
SELECT c.name, COUNT(o.order_id) AS orders
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
GROUP BY c.id, c.name;アンチ結合を示す手がかり
「一度も注文していない顧客」、「売上がない商品」、「上司がいない従業員」のような表現は、一致する行がない行を求めています。これはアンチ結合です。LEFT JOINとWHERE right_key IS NULL(またはNOT EXISTS)を組み合わせて実現します。
手がかりとなる語は、「一度もない」、「ない」、「〜なし」です。
SELECT c.name
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE o.order_id IS NULL;FULL OUTER JOINを示す手がかり
「2つのリストを照合し、どちらか一方にしかない項目も表示する」や「先月の勘定と今月の勘定を比較し、新規と削除の両方に印を付ける」のような表現では、両方のテーブルから一致しない行を残す必要があります。これはFULL OUTER JOINです。
照合や差分の問題が典型的なきっかけです。
SELECT a.id, b.id
FROM last_month a
FULL OUTER JOIN this_month b ON a.id = b.id
WHERE a.id IS NULL OR b.id IS NULL;CROSS JOINを示す手がかり
「すべての色についてすべてのサイズ」、「売上がない日でも店舗ごと・日ごとに1行」、「考えられるすべての組み合わせ」のような表現は、CROSS JOINを示します。
決め手は、2つの集合の間に一致条件が存在せず、「すべての...についてすべての」または「すべての組み合わせ」となっていることです。
SELECT s.size, c.color
FROM sizes s
CROSS JOIN colors c;SELF JOINを示す手がかり
「各従業員とその上司」、「同じ都市に住むユーザーのペア」、「重複するメールアドレスを見つける」のように、同じテーブル内の別の行との関係を表す表現は、自己結合を示します。
同じ種類の別のエンティティを参照したり、比較したりしていることが手がかりです。
SELECT e.name, m.name AS manager
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id;翻訳して考える例
問題文: 「すべての商品について、先月注文された回数を表示し、一度も注文されていない商品も含める」
読み解き方: 「すべての商品」に加えて「一度も注文されていない商品も含める」とあるため、すべての商品行を保持します。したがって、商品を注文にLEFT JOINし、注文側をCOUNTします。一致しない商品ではCOUNTがNULLを無視するため、結果は0になります。
SELECT p.name, COUNT(o.order_id) AS times_ordered
FROM products p
LEFT JOIN orders o
ON o.product_id = p.id
AND o.order_date >= DATE '2024-05-01'
GROUP BY p.id, p.name;よくある落とし穴:ONとWHEREでのフィルタリング
前のクエリでは、日付のフィルタをWHEREではなくON句に置いています。これにより、条件に一致する注文が0件の商品も保持されます。
order_date >= ...をWHEREに移すと、一致しない商品のNULL行が除外され、気付かないうちにLEFT JOINがINNER JOINに変わります。その結果、問題文が保持するよう求めていた商品そのものが失われます。
-- WRONG: WHERE on the outer table removes unmatched products
-- ...
-- LEFT JOIN orders o ON o.product_id = p.id
-- WHERE o.order_date >= '2024-05-01' <-- becomes an inner join判断フレームワーク
結合に関する文章題は、次のチェックリストに沿って考えてください。
- 同じテーブルを自身と関連付ける? -> SELF JOIN(深さに上限がない場合は再帰CTEも検討します)。
- 条件なしですべての組み合わせを作る? -> CROSS JOIN。
- 一致する行だけを残す? -> INNER JOIN。
- 片側をすべて残す? -> LEFT JOIN。
- 両側の一致しない行を残す? -> FULL OUTER JOIN。
- 一致する行がない行を求める? -> アンチ結合(LEFT JOIN + IS NULL)。
理解度チェック
このフレームワークを文章題に適用してみましょう。
まとめ:適切な結合の種類を選ぶ
重要なポイントです。
- 結合を判断するときは、まず一致しない行のうち、どれを残す必要があるかを確認します。
- 手がかりとなる語を対応付けます。「すべて/含む」→ LEFT、「一度もない/ない」→ アンチ結合、「すべての...についてすべての」→ CROSS、「各XとそのX」→ SELF、照合→ FULL OUTERです。
- 外部結合のフィルタは
ON句に置いてください。WHEREのフィルタによって、LEFT JOINが気付かないうちにINNER JOINへ降格することがあります。 - 面接では、このフレームワークを声に出して説明しましょう。暗記ではなく、考え方を示せます。
よくある質問
「適切なJOINの種類を選ぶ」レッスンは無料ですか?
はい。「適切なJOINの種類を選ぶ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Interview Prepコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Interview Prepコースには全4レッスンが含まれています。
「適切なJOINの種類を選ぶ」で何を学びますか?
文章問題から正しいJOINを選ぶための判断方法を学びます。 ブラウザで直接実行するハンズオンコードでSQL Interview Prepを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
SQL Interview Prepを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSQL Interview Prepは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「適切なJOINの種類を選ぶ」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSQL Interview Prepレッスンでコードを書いて実行できますか?
はい。すべてのSQL Interview Prepレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- CROSS JOINと直積
- 階層構造のためのSELF JOIN
- 1つのテーブル内で行を比較する
- 適切なJOINの種類を選ぶ