INNER JOIN と LEFT JOIN の違いを説明してください

相手の無い行が残るかどうか、の違いを例で示す問い。NULL が入ること、行の数が増えることまで答えます。

こう聞かれます

  • 「INNER JOIN と LEFT JOIN の違いを説明してください」
  • 「注文が 1 件も無い顧客も一覧に出したいとき、どう書きますか」
  • 「JOIN したら行の数が増えたのはなぜですか」

面接官が見ている点

  • 「相手の無い行が残るかどうか」を、例で示せるか
  • LEFT JOIN で相手の無い行には NULL が入る、と分かっているか
  • 1 対多の結合で、行が増えることに気づけるか

短い答え

  • INNER JOIN は、結合の条件に合う相手がいる組み合わせだけを返します。
  • LEFT JOIN は、左の表の行を全部残し、相手がいない行は右の表の列を NULL (空の値) で埋めます。
  • 1 人に注文が 2 件あれば 2 行になるので、どちらの結合でも、相手が多い側に合わせて行が増えます。

少し詳しい答え

同じ表で比べる

顧客が 2 人いて、佐藤さんだけが 2 件注文している例です。

SQL クエリ

CREATE TABLE customers (
  id INTEGER PRIMARY KEY,
  name VARCHAR(20)
);
CREATE TABLE orders (
  id INTEGER PRIMARY KEY,
  customer_id INTEGER,
  item VARCHAR(20)
);
INSERT INTO customers VALUES
  (1, '佐藤'),
  (2, '鈴木');
INSERT INTO orders VALUES
  (1, 1, 'ペン'),
  (2, 1, 'ノート');
SELECT c.name, o.item
FROM customers c
INNER JOIN orders o
  ON o.customer_id = c.id
ORDER BY o.id;
佐藤|ペン
佐藤|ノート

INNER JOIN では、注文の無い鈴木さんは出ません。佐藤さんは注文の数だけ 2 行になります。

SQL クエリ

SELECT c.name, o.item
FROM customers c
LEFT JOIN orders o
  ON o.customer_id = c.id
ORDER BY c.id, o.id;
佐藤|ペン
佐藤|ノート
鈴木|

LEFT JOIN では鈴木さんも残り、商品の欄が空になっています。この空が NULL です。

件数を数える

顧客ごとの注文の数を、0 件の人も含めて出すときは、LEFT JOIN のあと注文の側の列を数えます。

SQL クエリ

SELECT c.name, COUNT(o.id)
FROM customers c
LEFT JOIN orders o
  ON o.customer_id = c.id
GROUP BY c.id, c.name
ORDER BY c.id;
佐藤|2
鈴木|0

COUNT(o.id) は NULL を数えないので、注文の無い鈴木さんは 0 になります。COUNT(*) にすると、残った 1 行を数えて 1 になります。

作った物と結べると伝わりやすくなります。たとえば「管理画面で、まだ投稿していない会員も一覧に出したかったので、会員の表から投稿の表へ LEFT JOIN した」のように話します。

よくある間違い

  • 「LEFT JOIN は左の表の行数のまま」と言う相手が何件もあれば、その数だけ行が増えます。変わらないのは、左の行が消えないことです
  • LEFT JOIN のあと、右の表の条件を WHERE に置く たとえば WHERE o.item = 'ペン' にすると、NULL の行は条件に合わず消え、INNER JOIN と同じ結果になります。右の表を絞るなら ON に書きます
  • 0 件の人を数えるのに COUNT(*) を使う 相手の無い行も 1 行として数えるので、0 ではなく 1 になります

深掘りの問い

  • 「RIGHT JOIN との違いは」残す側が右の表になるだけです。表の順を入れ替えれば LEFT JOIN で書けるので、読みやすさのため LEFT にそろえる、と答えます
  • 「注文が 1 件でもある顧客だけを、行を増やさずに出すには」 EXISTS で、相手がいるかだけを調べる、と答えます
  • 「結合したら合計の金額が大きくなりすぎました。なぜですか」 1 対多の表を 2 つ同時に結合すると、行が掛け算で増えて同じ金額を何度も足すため、と答えます。先にそれぞれ集計してから結合します

確認日 2026年10月23日

技術面接問題の一覧へ戻る