0Pricing
SQL Interview Prep · レッスン

INNER JOINが行を照合する仕組み

あらゆるJOIN問題を簡単にする、行のペアリングの考え方を学びます。

「INNER JOINが行を照合する仕組み」はCoddyKit上の無料SQL Interview Prepレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Interview Prep学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Interview Prepコースには全4レッスンが含まれています。

面接官が最初に尋ねるJOIN

面接官が「この2つのテーブルを結合してください」と言った場合、ほとんどの場合はINNER JOINを意味します。これはデフォルトの結合であり、行がどのように組み合わされるかを本当に理解しているか確認できる結合です。

このテーマは、次の1文に集約できます。INNER JOINは、2つのテーブルから考えられるすべての行の組み合わせを調べ、ON条件を満たす組み合わせだけを残します。一致しなければ、その行は結果から消えます。

このメンタルモデルを身につければ、より難しい結合の問題もすべて簡単になります。

考えるための2つのテーブル

このレッスンでは、2つの小さなテーブルを使います。customersには注文した人が、ordersには各注文とその注文に属する顧客が記録されています。

  • customers(id, name)
  • orders(id, customer_id, amount)

両者を結び付けるのはorders.customer_id = customers.idです。この等式が結合述語であり、結果全体がこの条件に依存します。

customers
id | name
1  | Ada
2  | Bob
3  | Cleo   -- no orders yet

orders
id | customer_id | amount
10 | 1           | 50
11 | 1           | 20
12 | 2           | 99

基本的なINNER JOINクエリ

これは面接官が見たい典型的なクエリです。3つの部分に注目してください。2つのテーブル、行を組み合わせるJOIN ... ON、そして取得する列です。

キーワードINNERは、主要なすべてのデータベースで省略できます。単にJOINと書けばINNER JOINを意味しますが、明示的に書くことで意図が伝わり、コードレビューでの曖昧さも避けられます。

SELECT c.name, o.amount
FROM customers AS c
INNER JOIN orders AS o
  ON o.customer_id = c.id;

結果はどのようになるか

サンプルデータに対してこのクエリを実行すると、3行が得られます。Adaには2件の注文があるため、2回登場します。Bobは1回登場します。

Cleoは結果から消えます。一致する注文がないため、INNER JOINによって完全に除外されるのです。結合の面接では、一致しない行が消えることを明確に説明するのが最も重要です。

name | amount
Ada  | 50
Ada  | 20
Bob  | 99

行を組み合わせるメンタルモデル

まずデータベースが直積を作ると考えてみましょう。つまり、すべての顧客とすべての注文を組み合わせます。顧客が3人、注文が3件なら、候補となる組み合わせは9個です。

次にON述語を適用し、条件が真になる組み合わせだけを残します。9個の候補のうち、o.customer_id = c.idを満たすのは3個だけです。

パフォーマンスを考えるときにこの方法で処理するわけではありませんが、「何行が返るか」という問いに答えるための正確なモデルです。

候補となる組み合わせを追う

実際に追ってみましょう。各組み合わせの後ろにあるコメントは、述語が真かどうかを示しています。

TRUEの3行だけが結果に残ります。Cleo(id 3)を含む組み合わせはすべて条件を満たさないため、Cleoは何も結果に加えません。

-- customer.id vs order.customer_id
(Ada=1, ord10 cust=1)  -> TRUE  keep
(Ada=1, ord11 cust=1)  -> TRUE  keep
(Ada=1, ord12 cust=2)  -> FALSE
(Bob=2, ord10 cust=1)  -> FALSE
(Bob=2, ord12 cust=2)  -> TRUE  keep
(Cleo=3, anything)     -> FALSE (no order matches 3)

INNER JOINは順序に依存しない

よくある確認事項です。最初にどちらのテーブルを置くかは重要でしょうか。INNER JOINでは、重要ではありません。ON条件が対称的であるため、次の2つのクエリは同じ行を返します。

オプティマイザは、クエリをどのように記述したかに関係なく、どちらのテーブルを先に読み込んでも構いません。(後で扱うLEFT/RIGHT結合では、これは当てはまりません。)

-- These return the same rows
SELECT c.name, o.amount
FROM customers c JOIN orders o ON o.customer_id = c.id;

SELECT c.name, o.amount
FROM orders o JOIN customers c ON c.id = o.customer_id;

テーブルエイリアスが求められます

面接では、短く明確なエイリアスが求められます。冗長な完全修飾形式と、エイリアスを使った簡潔な形式を比較してください。

両方のテーブルに同じカラム名が存在する場合、エイリアスは必須にもなります。ここで単独のidを選択するとambiguous columnエラーになるため、c.idまたはo.idと記述する必要があります。

-- verbose
SELECT customers.name, orders.amount
FROM customers JOIN orders
  ON orders.customer_id = customers.id;

-- aliased, preferred
SELECT c.name, o.amount
FROM customers c JOIN orders o
  ON o.customer_id = c.id;

複数のカラムで結合する

ON述語は、1つの等式に限定されません。関係が複合キーによって定義されている場合は、条件をANDでつなぎます。

ここでは価格が商品ごと、かつ地域ごとに適用されるため、両方のカラムが一致する必要があります。面接では、単一カラムの結合を暗記しただけではないことを確認するために、このような質問が出されます。

SELECT s.units, p.unit_price
FROM sales s
INNER JOIN price_list p
  ON p.product_id = s.product_id
 AND p.region     = s.region;

非等価結合もあります

ON条件には、=だけでなく、任意のブール式を指定できます。非等価結合では、範囲や不等式を使用します。典型的な例として、スコアを成績の範囲に分類する処理があります。

各スコアは、その値を範囲に含む1つの成績帯に一致します。結合は等価条件だけに限定されないと説明できれば、経験豊富な印象をすぐに与えられます。

SELECT s.student, g.grade
FROM scores s
INNER JOIN grades g
  ON s.points >= g.min_points
 AND s.points <= g.max_points;

明示的なJOINとカンマ結合

レガシーコードや一部の面接問題では、古いカンマ結合の構文に出会うことがあります。次の2つのクエリは、INNER JOINの場合は同じ意味になります。

明示的なJOIN ... ON形式を使用してください。カンマ構文では、WHEREを付け忘れることで誤って直積を生成しやすくなります。これは、面接官が見つけたい典型的なバグです。

-- old implicit join
SELECT c.name, o.amount
FROM customers c, orders o
WHERE o.customer_id = c.id;

-- modern explicit join (preferred)
SELECT c.name, o.amount
FROM customers c
JOIN orders o ON o.customer_id = c.id;

確認問題

INNER JOINによる一致の基本的な考え方を確認してください。

まとめ: INNER JOINの一致の仕組み

面接で繰り返し説明できるよう、次の点を押さえてください。

  • INNER JOINは一致するペアだけを残し、左右どちら側でも一致しない行は除外します。
  • メンタルモデルとしては、まずすべての候補ペアを作り、ON述語がtrueになるものだけを残します。
  • 結果は順序に依存せず、INNERキーワードは省略できます。
  • ONでは、単一の=だけでなく、複合キー、範囲、不等式も使用できます。
  • 曖昧なカラムや意図しない直積によるバグを避けるため、明示的なJOIN ... ONと明確なエイリアスを使用してください。

よくある質問

「INNER JOINが行を照合する仕組み」レッスンは無料ですか?

はい。「INNER JOINが行を照合する仕組み」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Interview Prepコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Interview Prepコースには全4レッスンが含まれています。

「INNER JOINが行を照合する仕組み」で何を学びますか?

あらゆるJOIN問題を簡単にする、行のペアリングの考え方を学びます。 ブラウザで直接実行するハンズオンコードでSQL Interview Prepを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

SQL Interview Prepを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSQL Interview Prepは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「INNER JOINが行を照合する仕組み」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSQL Interview Prepレッスンでコードを書いて実行できますか?

はい。すべてのSQL Interview Prepレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

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

  1. INNER JOINが行を照合する仕組み
  2. JOINにおけるONとWHEREの違い
  3. JOINのファンアウトと行の増加
  4. 3つ以上のテーブルをJOINする
← SQL Interview Prepに戻る