0Pricing
Coding Interview Prep · レッスン

RIGHT JOINとFULL OUTER JOINの意味

それぞれが必要な場合と、RIGHT JOINをLEFT JOINに書き換える方法を学びます。

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

LEFT JOINの先へ

LEFT JOINを理解すると、面接官はその対となる結合と、両方を合わせた結合を試します。それが RIGHT JOIN と FULL OUTER JOIN です。

  • RIGHT JOIN は右テーブルのすべての行を保持します。
  • FULL OUTER JOIN は両方のテーブルから一致しない行を保持します。

このレッスンでは、それぞれを正確に定義し、面接官が好む書き換えのコツも示します。どのRIGHT JOINもLEFT JOINにできます。

RIGHT JOINの定義

RIGHT JOIN(または RIGHT OUTER JOIN)は、JOINキーワードの後に記述された右テーブルのすべての行を保持します。一致しない右側の行では、左テーブルの列が NULL になります。

これはLEFT JOINと正確に対称です。LEFTが最初に記述されたテーブルを保持するのに対し、RIGHTは2番目に記述されたテーブルを保持します。

SELECT c.name, o.amount
FROM orders o
RIGHT JOIN customers c
  ON o.customer_id = c.id;
-- keeps ALL customers, even those
-- with no order (Carol -> amount NULL)

もう一度テーブルを見る

データは先ほどと同じです。Carol(顧客3)には注文がありません。ここではすべての注文行が既存の顧客を参照しているため、customersを保持される側にすると、孤立した注文はありません。

-- customers           orders
-- 1 | Alice           10 | 1 | 50
-- 2 | Bob             11 | 1 | 75
-- 3 | Carol           12 | 2 | 20

RIGHTをLEFTに書き換える

面接での要点は次のとおりです。RIGHT JOINは実務ではほとんど使われません。テーブルの順序を入れ替えて、いつでもLEFT JOINを使えるからです。以下の2つのクエリは論理的に同一です。

左から右へ読み、常に左テーブルを保持するほうが考えやすいため、多くのスタイルガイドではRIGHT JOINを完全に禁止しています。

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

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

FULL OUTER JOINの定義

FULL OUTER JOIN は、両方のテーブルから一致しない行を保持します。LEFT JOINとRIGHT JOINを組み合わせたものと考えてください。

  • 一致する組み合わせは通常どおり表示されます。
  • 一致しない左側の行では、右側の列がNULLになります。
  • 一致しない右側の行では、左側の列がNULLになります。

これは「両側のすべてを表示し、一致するものを対応付けてください」という要件に答える結合です。

SELECT c.name, o.id AS order_id
FROM customers c
FULL OUTER JOIN orders o
  ON o.customer_id = c.id;

FULL OUTERが活躍する場面

FULL OUTER JOINは、突合に最適です。つまり、一致するはずだが一致しない可能性のある2つのデータセットを比較する場合です。

orders テーブルと、別の payments テーブルを考えてみましょう。注文IDでFULL OUTER JOINすると、支払いのない注文と、一致する注文のない支払いを1つの結果で見つけられます。どちらも、欠けている側がNULLになることで示されます。

SELECT o.id AS order_id, p.id AS payment_id
FROM orders o
FULL OUTER JOIN payments p
  ON p.order_id = o.id
WHERE o.id IS NULL OR p.id IS NULL;
-- rows where one side is missing

SQL方言への理解

面接官は移植性について掘り下げて質問することがあります。MySQLにはFULL OUTER JOINキーワードがありません(バージョン8まで)。Postgres、SQL Server、Oracleはサポートしています。

MySQLでは、LEFT JOINとRIGHT JOINをUNIONで結合することで代用します(UNIONが重複する一致行を取り除きます)。この違いを理解していることは、実務経験がある証拠になります。

-- FULL OUTER JOIN emulated in MySQL
SELECT c.name, o.id FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
UNION
SELECT c.name, o.id FROM customers c
RIGHT JOIN orders o ON o.customer_id = c.id;

4種類のJOINを一目で把握する

この表を頭に入れておいてください。「保持される」とは、不一致の行がNULL付きで残るという意味です。

  • INNER JOIN:一致した行だけです。何も保持されません。
  • LEFT JOIN:左側のすべての行が保持されます。
  • RIGHT JOIN:右側のすべての行が保持されます。
  • FULL OUTER JOIN:両側が保持されます。

外部結合に関する面接の質問は、どちら側(または両側)を保持するかを選ぶ問題に集約されます。

使い分ける

「一致しない行のうち、どれを残す必要があるか」と考えてJOINを選びます。

  • 起点となる主テーブルの行だけを残す:LEFT JOIN(主テーブルを先に置きます)。
  • 照合のために両側の不一致データが必要:FULL OUTER JOIN。
  • 一致する行だけが必要:INNER JOIN。

RIGHT JOINを積極的に選ぶことはほとんどありません。テーブルの順序を入れ替えてLEFT JOINとして捉え直します。

照合の例

FULL OUTER JOINを使って、各行の状態をラベル付けしてみましょう。CASEでNULLのパターンを調べると、どちら側が欠けているかが分かります。これは監査でよく使う典型的なクエリです。

SELECT
  COALESCE(o.id, p.order_id) AS ord,
  CASE
    WHEN p.id IS NULL THEN 'no payment'
    WHEN o.id IS NULL THEN 'orphan payment'
    ELSE 'matched'
  END AS status
FROM orders o
FULL OUTER JOIN payments p ON p.order_id = o.id;

よくある誤解

FULL OUTER JOINは、不一致の行同士の直積を返すと思っている候補者がよくいます。しかし、そうではありません。各側の不一致の行はそれぞれ1回だけ、NULLと組み合わされて現れます。互いの行同士で掛け合わされることはありません。

一致した行については通常のJOINと同じく、すべての一致する組み合わせにつき1行が出力されます。これはどのJOINにも当てはまるファンアウトの規則です。

クイックチェック

面接官から、RIGHT JOINを禁止しているチーム向けにクエリを書き換えるよう求められました。

まとめ

RIGHT JOINは右側のテーブルを保持し、FULL OUTER JOINは両側を保持します。テーブルの順序を入れ替えれば、どのRIGHT JOINもLEFT JOINに書き換えられます。そのため、チームではLEFT JOINが好まれます。

  • FULL OUTERは2つのデータセットの照合に適しています。
  • MySQLにはFULL OUTERがないため、LEFT + RIGHT + UNIONで代用します。
  • どの不一致の行を残すかを決めてJOINを選びます。
  • 不一致の行はNULL付きで1回だけ現れ、直積にはなりません。

よくある質問

「RIGHT JOINとFULL OUTER JOINの意味」レッスンは無料ですか?

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

「RIGHT JOINとFULL OUTER JOINの意味」で何を学びますか?

それぞれが必要な場合と、RIGHT JOINをLEFT JOINに書き換える方法を学びます。 ブラウザで直接実行するハンズオンコードでCoding Interview Prepを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「RIGHT JOINとFULL OUTER JOINの意味」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

  1. LEFT JOINと不一致行の保持
  2. RIGHT JOINとFULL OUTER JOINの意味
  3. 一致する行がない行を検索する(アンチJOIN)
  4. 外部JOINでWHEREを使う落とし穴
← Coding Interview Prepに戻る