0Pricing
SQL Interview Prep · レッスン

適切な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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. CROSS JOINと直積
  2. 階層構造のためのSELF JOIN
  3. 1つのテーブル内で行を比較する
  4. 適切なJOINの種類を選ぶ
← SQL Interview Prepに戻る