JOIN句
JOIN句は、複数のテーブルを結合するための条件をFROM句で指定する方法です。
通常の結合ではFROM句にてテーブル名を「,」で区切り記述しますが、結合条件を記述するためにはJOIN句を使用します。
結合には内部結合(INNER JOIN)、外部結合(OUTER JOIN)があり、結合するテーブル間にJOIN句を記述し、
「ON」に続けて条件式を記述することで、対象テーブルを行単位に結合することが可能となります。
文法
SELECT 列名 [ ,列名... ] FROM テーブル名 エイリアス [ LEFT OUTER | RIGHT OUTER | FULL OUTER | INNER ] JOIN テーブル名 エイリアス ON 条件式
INNER JOIN句(内部結合)
結合には内部結合、外部結合があり、INNER JOINは内部結合に該当します。
対象テーブルを行単位に結合し、結合条件に該当する行のみを抽出します。
使用例1 : 通常の内部結合
SELECT * FROM teble_name1 INNER JOIN teble_name2 ON teble_name1.column = teble_name2.column;
使用例2 : 3つ以上の結合
teble_name1 と teble_name2 を内部結合した結果に対し、teble_name3 を内部結合します。
SELECT * FROM (teble_name1 INNER JOIN teble_name2 ON teble_name1.column = teble_name2.column) INNER JOIN teble_name3 ON teble_name1.column = teble_name3.column;
LEFT JOIN句 / RIGHT JOIN句(外部結合)
外部結合では指定した記述位置(LEFT / RIGHT)のテーブルを主とし、他方のテーブル内に結合条件に該当する行が存在する場合、主テーブルの行に結合します。
つまり、LEFT JOIN を指定した場合、左辺のテーブルすべての行が抽出対象となり、右辺のテーブルについては結合条件に該当する行のみが抽出対象となります。
また、主となるテーブルの1つの行に対し、他方のテーブルに結合条件に該当する行が複数存在する場合(1:n の状態)、複数の行が結合されます。
その為、主となるテーブルの行数以上の結果が抽出されることになります。
補足ですが、外部結合は INNER JOIN のように、本来は OUTER で修飾し、 LEFT OUTER JOIN と記述しますが、通常これを省略し、LEFT JOIN のように記述します。
使用例1 : 左辺を主とする外部結合
SELECT * FROM teble_name1 LEFT JOIN teble_name2 ON teble_name1.column = teble_name2.column;
使用例2 : 右辺を主とする外部結合
SQLiteはRIGHT OUTER JOINをサポートしていません。
SELECT * FROM teble_name1 RIGHT JOIN teble_name2 ON teble_name1.column = teble_name2.column;
FULL OUTER JOIN句(完全外部結合)
完全外部結合では結合対象となる両テーブルの全ての行(結合条件に該当する行、該当しない行)を対象に抽出します。
つまり、左辺にのみ存在する行、右辺にのみ存在する行、結合条件で結合した行全ての結果が得られます。
使用例
SELECT * FROM teble_name1 FULL OUTER JOIN teble_name2 ON teble_name1.column = teble_name2.column;
CROSS JOIN句(交差結合)
交差結合に結合条件はありません。
左辺テーブルの全行に右辺テーブルの全行が結合された結果が得られます。
これは「デカルト積(デカルトせき、Cartesian product)」よ呼ばれ、全てのテーブル内の全ての行の全ての可能な組み合わせとして定義されます。
このことは特に、テーブルに数百あるいは数千もの行が含まれるような場合には望ましくありません。
使用例
SELECT * FROM teble_name1 CROSS JOIN teble_name2;
USING句
結合する条件が同じ名前の列である場合、USINGを使用して結合条件を記述することが出来ます。
使用例
USINGの括弧内に結合条件に使用する列名を記述します。
SELECT * FROM teble_name1 INNER JOIN teble_name2 USING(column);