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 orderLEFT 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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- なぜJOINが必要か(リレーショナルモデルの復習)
- INNER JOINの仕組み
- LEFT/RIGHT JOINとOUTER JOIN
- 自己結合と別名