結合
全然頭に入らないので、整理。
表の結合を行う際に、表接頭辞として「表名」や「表別名」表別名を、
指定することによりパフォーマンスが向上する。
但し、同じ表の表接頭辞として「表名」と「表別名」は混在できない。
等価結合
2つの表の特定の列の値が必しいデータだけを取り出す結合
非等価結合
等号(=)以外の演算子を使用した結合
自然結合
自然結合は、2つの表に共通して存在する同名で同じデータ型の列に基づいて結合。
- 結合列に表接頭辞の使用不可
- 2つの表に共通して存在する列に基づいて結合を行う
- データ型の異なる同名の列がある場合はエラーとなる
- 結合条件は指定する必要なし(WHERE書き)
- 2つの表に同名で同じデータ型の列が複数ある場合はその組合せで結合
●NATURAL JOIN
自然結合のデフォルト。
結合条件が必要ない分、同じ名前の列名を無条件に結合させてしまうため、
希望通りの結合ができない場合がある。
また、NATURAL JOINとUSINGは一度の結合に同時に使用できない。
× FROM A NATURAL JOIN B USING(a_id);
〇 FROM A NATURAL JOIN B JOIN C USING(c_id);
FROM '表名1' NATURAL JOIN '表名2';
●USING
自然結合では、同名でデータ型が異なる列を結合してしまい
エラーが起きるので、USINGを使用する。USINGは、
等価結合の1つなので、結合列を明示的に指定することができる。
USING句を使用する場合、結合列に表接頭辞は記述できない。
逆に、結合列以外の列名に表接頭辞を記述できる。
◎USINGを使う場合
- 結合する2つの表に同じ列名でデータ型の異なる列がある場合
- 結合する2つの表の一部の列を結合列として使用する場合
- 等価結合を行う場合
FROM '表名1' JOIN '表名2' USING('結合列名1'[,'結合列名2',...]);
内部結合
JOIN ON (内部結合)
ON句を使用した結合では、自然結合やUSING句での結合とは、
異なり、列名が違っていいても結合列として指定することが可能。
'表名1' JOIN '表名2' ON '結合条件';
3つ以上の表を結合する場合
'表名1' JOIN '表名2' ON '結合条件'
JOIN '表名3' ON '結合条件' ... ;
CROSS JOIN (クロス結合)
クロス結合は、指定されている2つの表に登録されている行の
すべての組合せ(≒デカルト積)を返す。
同等データの取得には結合条件を指定しない結合結果が◎
FROM '表名1' CROSS JOIN '表名2';
-- ▽置換
FROM '表名1', '表名2';
自己結合
己の表を己の条件式に用いて結合する。
NATURAL JOINとか内部結合とかいろいろやり方あるので割愛。
外部結合
結合条件を満たしたデータのみだけではなく、
条件を満たしていないデータも一緒に取り出す方法を外部結合という。
FROM '表名1' [LEFT|RIGHT|FULL] [OUTER] JOIN '表名2' ON '条件式';
下記は、Oracle独特の書き方。
結合側に(+)を記述する。
※(+)...外部結合演算子
FROM '表名1','表名2'
WHERE ['表接頭辞1'.]'列名'[(+)] = ['表接頭辞2'.]'列名'[(+)]
[AND '結合条件以外の条件'];
なお、外部結合演算子は両側に指定することはできず、
指定された場合はエラーを返す。
LEFT [OUTER] JOIN
JOIN句の左側の表のデータをすべて取り出す
RIGHT [OUTER] JOIN
JOIN句の右側の表のデータをすべて取り出す
FULL [OUTER] JOIN
2つの表のデータをすべて取り出す