外部結合(OUTER JOIN句)
2 つのテーブルを結合してデータを取得する方法の中で、指定したそれぞれのテーブルのカラムの値が一致するデータだけではなくどちらかのテーブルにだけデータがある場合も合わせて取得する方法が外部結合です。ここでは SQLite で外部結合を行うための LEFT OUTER JOIN 句の使い方について解説します。
(Last modified: )
外部結合とは
最初に外部結合について簡単に説明しておきます。外部結合とは2つのテーブルでそれぞれ結合の対象となるカラムを指定し、それぞれのカラムに同じ値が格納されているデータを結合して取得するものです。内部結合の場合は、一致しないデータは取得しませんでしたが、外部結合の場合は一致しない場合もデータとして取得します。
次の図を見て下さい。左側のテーブルと右側のテーブルを外部結合します。結合の対象となるカラムは左側のテーブルが「部署ID」、右側のテーブルが「ID」です。この2つのカラムの値が同じデータ同士を結合し取得します。
左側のテーブルのデータの中で「部署ID」カラムの値が右側のテーブルの「ID」カラムの値の中にない場合にもデータを取得している点について注意してください。
外部結合の場合、左側のテーブルにしかないデータも取得する方法を左外部結合、右側のテーブルにしかないデータも取得する方法を右外部結合、左側のテーブルにしかないデータも右側のテーブルにしかないデータもすべて取得する方法を完全外部結合といいます。ただ SQLite の場合は左外部結合を行う LEFT OUTER JOIN 句のみサポートしています。右外部結合を行う RIGHT OUTER JOIN 句や完全外部結合を行う FULL OUTER JOIN 句を使おうとすると Error: RIGHT and FULL OUTER JOINs are not currently supported というエラーが発生しますので注意してください。
LEFT OUTER JOIN句の使い方
SELECT 文と LEFT OUTER JOIN 句を組み合わせることで2つのテーブルを外部結合させてデータを取得することができます。書式は次の通りです。
SELECT テーブル名.カラム名, ... FROM テーブル名1
LEFT OUTER JOIN テーブル名2
ON テーブル名1.カラム名1 = テーブル名2.カラム名2;
長いので簡略化すると次のようになります。
SELECT (取得するカラム) FROM テーブル名1
LEFT OUTER JOIN テーブル名2 ON (結合条件);
SELECT 文で取得するデータは2つのテーブルを結合したものから取得します。取得するカラムはどちらのテーブルにあるどのカラムなのかが分かるように「テーブル名.カラム名」の形式で指定します。
結合条件のところでは結合の対象となるカラムについて「テーブル名1.カラム名1 = テーブル名2.カラム名2」の形式で指定します。
外部結合は内部結合の場合と似ているのですが、 LEFT OUTER JOIN 句を使用する場合は結合の対象となっているカラムの値が一致しているデータに加えて、カラムの値が FROM の後に書かれたテーブルにしかなかった場合でもデータとして取得します。
-- --
それでは簡単な例を使ってどのように使用するのかについて確認します。社員の一覧が登録された staff テーブルと、部署が登録された dept テーブルを用意しました。それぞれ INSERT 文を使ってデータを格納してあります。
create table staff(id integer, name text, deptid integer);
insert into staff values(1, 'Suzuki', 1);
insert into staff values(2, 'Endou', 3);
insert into staff values(3, 'Katou', 1);
insert into staff values(4, 'Yamada', 2);
insert into staff values(5, 'Takahashi', 4);
insert into staff values(6, 'Honda', 3);
create table dept(id integer, name text);
insert into dept values(1, 'Sales');
insert into dept values(2, 'Manage');
insert into dept values(3, 'Dev');
-- --
では最初に staff テーブルに dept テーブルを外部結合し、データを取得してみます。
select * from staff left outer join dept on staff.deptid = dept.id;
内部結合の場合と異なり、外部結合の場合には FROM のあとに書かれたテーブルにしかないデータも取得するためテーブルの順番が入れ替わると結果が異なります。先ほどとは逆に dept テーブルに staff テーブルを外部結合してみます。
select * from dept left outer join staff on dept.id = staff.deptid;
dept テーブルに staff テーブルを外部結合した場合、 dept テーブルにしかないデータがありませんでしたので、内部結合の場合と同じ結果となりました。
取得するデータのカラム指定方法
取得するデータのカラム指定方法は内部結合の場合と同じです。詳細は「取得するデータのカラム指定方法」を参照されて下さい。2つのテーブルで同じカラム名がある場合は「テーブル名.カラム名」のように指定し、どちらかのテーブルにしかないカラム名の場合はテーブル名を省略して「カラム名」で指定します。
外部結合の場合も実際に試しておきます。
select staff.id, staff.name, dept.name from staff
left outer join dept on staff.deptid = dept.id;
-- --
外部結合を行うための LEFT OUTER JOIN 句の使い方について解説しました。
( Written by Tatsuo Ikura )
著者 / TATSUO IKURA
これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。