ここではRDBにおけるOUTER JOIN(外部結合)を解説します。概要を理解しやすくするため、まずは「結合」から考えていきたいと思います。
Contents
RDBにおける「結合」とは
リレーショナルデータベースにおける「結合」とは、2つ以上のテーブルを共通の値を持つカラムを「糊」にしてくっつけることで、一つの表にしてしまうことをいいます。例えば下のSQLは、「userのidを『糊』にしてparticipantsテーブルとusersテーブルを結合した」結果を出力します。
SELECT * FROM participants, users WHERE participants.user_id=users.id;
実は、このSQLで行われているのが「内部結合(INNER JOIN)」です。指定したカラムの値が一致するレコードのみを抽出するという手法です。言い換えると内部結合では、結合元のテーブルのいずれかにないレコードは抽出対象になりません。
そしていずれかのテーブルにないレコードも抽出対象に含めるのが、外部結合(OUTER JOIN)なのです。
外部結合(OUTER JOIN)
そんな外部結合は、「ないレコードの含め方」によってさらに3つの種類に分かれます。
①左外部結合(LEFT OUTER JOIN)
左外部結合(LEFT OUTER JOIN)は、2つのテーブルのうち「FROM」で指定した方のテーブルの全データを取り出して、「JOIN」で指定した方のテーブルのうち該当レコードをくっつける、という処理を行います。例えば下のSQLはusersテーブルとparticipantsテーブルの左外部結合を行うものですが、partipantsテーブルでのレコードのあるなしに関わらず、usersテーブルのレコードは全件抽出されます。
SELECT * FROM users LEFT JOIN participants;
②右外部結合(RIGHT OUTER JOIN)
右外部結合(RIGHT OUTER JOIN)は左外部結合とは逆に、「JOIN」で指定した方のテーブルから全データを抽出し、「FROM」で指定した方のテーブルの該当レコードを結合します。ちなみに慣用的には、一般的にLEFT OUTER JOINを利用するケースが多い印象です。
③完全外部結合(FULL OUTER JOIN)
そして完全外部結合(FULL OUTER JOIN)では、いずれのテーブルからも全データを取り出して結合を行います。もしお互いに存在しない部分には、「NULL」値が入ることになります。