テーブルの結合について、自分なりにまとめてみた。
前回の内部結合編から続いて、今回は外部結合編をお送りいたします。
外部結合は、内部結合のようにそれぞれのテーブルの指定したカラムの値が一致するものを結合するのに加え、どちらかのテーブルにしか存在しないものに関しても取得する。
基本的な構文は以下の通り。
SELECT カラム名1,カラム名2,…….
FROM テーブル1(左側)
LEFT(RIGHT) OUTER JOIN テーブル名2(右側)
ON 結合の条件 |
SQL中にLEFTやRIGHTの記載があるが、内容は以下の通り
- LEFT OUTER JOIN : 左側のテーブルを軸にして外部結合を行う方法
- RIGHT OUTER JOIN : 右側のテーブルを軸にして外部結合を行う方法
|
以下の例示では、使用するテーブルとデータはそのままに
SQLの「LEFT」と「RIGHT」部分だけを変更して結果の変わりようも示す。
◆基準となるテーブル:子供テーブル(Kodomo)
◆結合させるテーブル:親テーブル(Oya)
◆結合条件:子供テーブルの「oya_id」 と 親テーブルの「id」 が一致するデータ
子供テーブル(基準となるテーブル):Kodomo
id |
name |
oya_id |
1 |
ichiro |
1 |
2 |
jiro |
2 |
3 |
saburo |
1 |
4 |
shiro |
4 |
親テーブル(結合させるテーブル):Oya
id |
name |
1 |
taro |
2 |
hanako |
3 |
gonzou |
(SQL)
SELECT * FROM Kodomo –基準となるテーブル(左側)
LEFT OUTER JOIN Oya –結合させるテーブル(右側)
ON Kodomo.oya_id = Oya.id; –結合条件1(※この後にANDで複数条件も可能) |
(結果)
子供テーブルは全量表示(基準となるテーブルのため。WHERE句で条件指定してれば全量表示とは限らない)
結合条件に一致しない、親テーブル.id=3(gonzou)がSELECTされずに「null」埋めされる。
id |
name |
oya_id |
id |
name |
1 |
ichiro |
1 |
1 |
taro |
2 |
jiro |
2 |
2 |
hanako |
3 |
saburo |
1 |
1 |
taro |
4 |
shiro |
4 |
null |
null |
◆結合させるテーブル:子供テーブル(Kodomo)
◆基準となるテーブル:親テーブル(Oya)
◆結合条件:子供テーブルの「oya_id」 と 親テーブルの「id」 が一致するデータ
※データ内容は上記(LEFT OUTER JOIN)と同じため割愛
(SQL)
SELECT * FROM Kodomo –結合させるテーブル(左側)
RIGHT OUTER JOIN Oya –基準となるテーブル(右側)
ON Kodomo.oya_id = Oya.id; –結合条件1(※この後にANDで複数条件も可能) |
(結果)
親テーブルは全量表示(基準となるテーブルのため。WHERE句で条件指定してれば全量表示とは限らない)
結合条件に一致しない、子供テーブル.oya_id=4(shiro)がSELECTされずに「null」埋めされる。
id |
name |
oya_id |
id |
name |
1 |
ichiro |
1 |
1 |
taro |
3 |
saburo |
1 |
1 |
taro |
2 |
jiro |
2 |
2 |
hanako |
null |
null |
null |
3 |
gonzou |
1.LEFT OUTER JOINなら左側(FROM句の後)のテーブルを基準に表示
2.RIGHT OUTER JOINなら右側(JOIN句の後)のテーブルを基準に表示
3.マッチするレコードが複数あった場合、1,2レコード目のように、マージしたものをそれぞれ別のレコードにする。
4.条件にマッチするレコードがないものは、基準としないテーブルはすべてnull表示される。