0Pricing
SQL Academy · レッスン

LEFT/RIGHT JOINとOUTER JOIN

LEFT JOINで一致しない行を残し、RIGHTおよびFULL OUTER JOINを理解し、WHERE x IS NULLで欠損データを検出します。

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

LEFT JOIN:左側のすべての行を保持する

LEFT JOINは左側のテーブルのすべての行を返し、右側に一致する列があればその値を、なければNULLを返します。

SELECT u.id, u.email, o.id AS order_id
FROM users u
LEFT JOIN orders o ON o.user_id = u.id;

-- Users without orders still appear, with order_id = NULL.

RIGHT JOIN

LEFT JOINの反対で、右側のすべての行を保持します。読みやすさのため、RIGHT JOINをLEFT JOINに書き換える人がほとんどです:

SELECT u.id, u.email, o.id
FROM orders o
RIGHT JOIN users u ON u.id = o.user_id;

-- Equivalent to LEFT JOIN with sides swapped:
SELECT u.id, u.email, o.id
FROM users u
LEFT JOIN orders o ON o.user_id = u.id;

FULL OUTER JOIN

両側の行を保持します。一致しない側の列はNULLになります:

SELECT u.email, o.id AS order_id
FROM users u
FULL OUTER JOIN orders o ON o.user_id = u.id;

一致しない行を見つける

WHERE right.id IS NULLを指定したLEFT JOINを使うと、右側に一致する行がない左側のテーブルの行を見つけられます。これは典型的な「アンチJOIN」です:

SELECT u.id, u.email
FROM users u
LEFT JOIN orders o ON o.user_id = u.id
WHERE o.id IS NULL;        -- users who have never placed an order

LEFT JOINと集約

「存在しない場合は0」とするレポートに便利です:

SELECT u.id, u.email, COUNT(o.id) AS order_count
FROM users u
LEFT JOIN orders o ON o.user_id = u.id
GROUP BY u.id, u.email
ORDER BY order_count DESC;

フィルタの位置が重要

右側のテーブルに対するフィルタをWHEREに記述すると、LEFT JOINがINNER JOINに戻ってしまいます。LEFT JOINの動作を維持するには、ONに記述してください:

-- Drops users without paid orders entirely:
SELECT u.id, COUNT(o.id)
FROM users u
LEFT JOIN orders o ON o.user_id = u.id
WHERE o.status = 'paid'
GROUP BY u.id;

-- Keeps users with no paid orders:
SELECT u.id, COUNT(o.id)
FROM users u
LEFT JOIN orders o
  ON o.user_id = u.id AND o.status = 'paid'
GROUP BY u.id;

複数のLEFT JOIN

連鎖させます。各LEFT JOINは、その演算子の左側にある行を保持します:

SELECT u.email, o.id, p.name
FROM users u
LEFT JOIN orders o   ON o.user_id = u.id
LEFT JOIN products p ON p.id = o.product_id;

LEFT JOINのパフォーマンス

LEFT JOINにはINNER JOINよりわずかなオーバーヘッドがあります(プランナーは一致しない行も保持する必要があります)。多くの場合は無視できる程度ですが、一致しない行が不要ならINNER JOINの方が少し効率的です。

外部結合とNULLの出力

LEFT JOINによるNULLの出力は、後続のコードにとって意外な結果になることがあります。デフォルト値を提供するにはCOALESCEを使用してください:

SELECT u.email, COALESCE(SUM(o.total), 0) AS revenue
FROM users u
LEFT JOIN orders o ON o.user_id = u.id
GROUP BY u.email;

CROSS JOIN — すべての組み合わせが必要な場合

Aのすべての行をBのすべての行と結合します。使用は控えめにしてください:

SELECT d.date, u.id
FROM users u
CROSS JOIN generate_series('2024-01-01', '2024-01-07', INTERVAL '1 day') AS d(date);

アンチJOINのパターン

「左側にあって右側に一致しない行」を見つける慣用的な方法は3つあります:

-- LEFT JOIN ... WHERE IS NULL
SELECT u.* FROM users u
LEFT JOIN orders o ON o.user_id = u.id
WHERE o.id IS NULL;

-- NOT EXISTS (often the planner's favourite)
SELECT u.* FROM users u
WHERE NOT EXISTS (SELECT 1 FROM orders o WHERE o.user_id = u.id);

まとめ

OUTER JOINは一致しない行を保持します。

  • LEFT = 左側のすべての行。一致しない場合は右側がNULL
  • RIGHT = その反対。読みやすさのためLEFTを使用します
  • FULL OUTER = 両側のすべての行
  • アンチJOIN = LEFT JOIN ... WHERE right IS NULL

確認問題

注文が1件もないユーザーも返すJOINの種類はどれですか?

よくある質問

「LEFT/RIGHT JOINとOUTER JOIN」レッスンは無料ですか?

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

「LEFT/RIGHT JOINとOUTER JOIN」で何を学びますか?

LEFT JOINで一致しない行を残し、RIGHTおよびFULL OUTER JOINを理解し、WHERE x IS NULLで欠損データを検出します。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

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

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

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

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

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

  1. なぜJOINが必要か(リレーショナルモデルの復習)
  2. INNER JOINの仕組み
  3. LEFT/RIGHT JOINとOUTER JOIN
  4. 自己結合と別名
← SQL Academyに戻る