menu
language日本語
save_alt ダウンロード

SQL JOIN チートシート

すべての SQL JOIN の種類を図とコード例で確認できるクイックリファレンスです

INNER JOIN 最もよく使われる

両方のテーブルで値が一致する行のみを返します。デフォルトの JOIN の種類で、最もよく使われます。
SELECT orders.id, customers.name, orders.amount
FROM orders
INNER JOIN customers
  ON orders.customer_id = customers.id

ポイント:

  • 両方のテーブルで一致するレコードのみを返す
  • 一致しない行は自動的に除外される
  • パフォーマンス面で最も効率的な JOIN
  • 単に JOIN と書くこともできる(INNER は省略可能)

LEFT JOIN

左テーブルのすべての行と、右テーブルの一致する行を返します。一致がない場合、右テーブルの列には NULL が返されます。
SELECT customers.name, orders.amount
FROM customers
LEFT JOIN orders
  ON customers.id = orders.customer_id

ポイント:

  • 左(1つ目)のテーブルのレコードをすべて保持する
  • 一致しない右テーブルの列には NULL が入る
  • LEFT OUTER JOIN とも呼ばれる
  • 関連データのないレコードを探すのに便利

RIGHT JOIN

右テーブルのすべての行と、左テーブルの一致する行を返します。LEFT JOIN の逆です。
SELECT orders.amount, customers.name
FROM orders
RIGHT JOIN customers
  ON orders.customer_id = customers.id

ポイント:

  • 右(2つ目)のテーブルのレコードをすべて保持する
  • 一致しない左テーブルの列には NULL が入る
  • RIGHT OUTER JOIN とも呼ばれる
  • 常に LEFT JOIN に書き換えられる

FULL OUTER JOIN

両方のテーブルのすべての行を返し、どちらか一方に一致がない箇所には NULL が入ります。
SELECT customers.name, orders.amount
FROM customers
FULL OUTER JOIN orders
  ON customers.id = orders.customer_id

ポイント:

  • LEFT JOIN と RIGHT JOIN の結果を組み合わせたもの
  • 両方のテーブルのレコードをすべて表示する
  • MySQL では非対応(代わりに UNION を使用)
  • すべての関係と欠落を把握するのに便利

CROSS JOIN 使用に注意

両方のテーブルの直積(デカルト積)を返します。1つ目のテーブルの各行が、2つ目のテーブルのすべての行と組み合わされます。
SELECT sizes.name, colors.name
FROM sizes
CROSS JOIN colors

-- Alternative syntax
SELECT sizes.name, colors.name
FROM sizes, colors

ポイント:

  • ON 句は不要(結合条件なし)
  • 結果の行数 = 左テーブルの行数 × 右テーブルの行数
  • あっという間に巨大な結果セットになる
  • 組み合わせやテストデータの生成に便利

LEFT ANTI JOIN

右テーブルに一致する行がない、左テーブルの行を返します。関連のないレコードを探すのに便利です。
SELECT customers.name
FROM customers
LEFT JOIN orders
  ON customers.id = orders.customer_id
WHERE orders.id IS NULL

-- Alternative: NOT EXISTS
SELECT customers.name
FROM customers
WHERE NOT EXISTS (
  SELECT 1 FROM orders
  WHERE orders.customer_id = customers.id
)

ポイント:

  • LEFT JOIN + WHERE IS NULL で実装する
  • 関連データのないレコードを見つける
  • 「LEFT EXCLUDING JOIN」とも呼ばれる
  • 例: 一度も注文したことのない顧客

RIGHT ANTI JOIN

左テーブルに一致する行がない、右テーブルの行を返します。LEFT ANTI JOIN の逆です。
SELECT orders.id
FROM customers
RIGHT JOIN orders
  ON customers.id = orders.customer_id
WHERE customers.id IS NULL

-- Usually rewritten as LEFT ANTI JOIN
SELECT orders.id
FROM orders
LEFT JOIN customers
  ON orders.customer_id = customers.id
WHERE customers.id IS NULL

ポイント:

  • RIGHT JOIN + WHERE IS NULL で実装する
  • 右テーブル内の孤立したレコードを見つける
  • 常に LEFT ANTI JOIN に書き換えられる
  • 例: 有効な顧客が存在しない注文

もっと快適に SQL を書きたいですか?

Beekeeper Studio は、オートコンプリートやクエリ履歴を備え、15 種類以上のデータベースに対応したモダンで直感的な SQL エディタです。

Beekeeper Studio を無料で試す