内部結合と外部結合の違いについて紹介していきます。
テーブルの結合
複数のテーブルを結合して一つのテーブルを作成して表示させる方法があります。
結合方法は大きく分けて内部結合と外部結合に分かれます。
それぞれの特徴についてお話していきます
前提条件
画像には二つのテーブルがあります。こちらを例にお話ししていきます。
使用するテーブル
- USERSテーブル ⇒ ユーザー管理をしている。
- ORDERSテーブル ⇒ 購入履歴を管理している。
USERSテーブルのIDカラムとORDERSテーブルのUSER_IDカラムは紐づいていて、どのユーザーが購入した履歴なのかがわかるようになっています。
このID同士の紐づけで各テーブルを結合しています。
内部結合
内部結合(inner join)はお互いのテーブルに一致する情報があるレコードのみテーブルを結合してデータを出力することができます。
画像にあるusersテーブル赤枠のidにはユーザーが№1~6の計6人いることがわかります。ですが、ORDERSテーブル赤枠のuser_idの数字を見てみると№1~5の計5人分のデータしかありません。
このことからUSERSテーブルのid6の秋田犬さんは商品を購入したことがないことがわかります。
購入履歴のないユーザーのいるテーブル同士を内部結合で結合すると、作成されたテーブルからは一致する情報のない秋田犬さんは除外されて表示されなくなってしまいました。
そして、購入履歴のあるユーザーにはordersテーブルの情報が結合して表示されています。
内部結合の詳細は下記を参照
外部結合
外部結合(left/right outer join) はお互いのテーブルを一致する情報がないレコードも含めてテーブルを結合してデータを出力することができます。その時に一方にしかデータのないレコードは不足している情報のカラムが『Null』となって表示されます。
内部結合では購入履歴のない秋田犬さんは結合したテーブルからは除外されていましたが、外部結合では除外されずに情報のないカラムには『Null』と表示されています。
外部結合の種類(left join/right join)
外部結合はどちらかに情報のないレコードも表示させることができると説明しましたが、二つのテーブルそれぞれに片方にしか情報のないデータがあった場合には両方とも表示されるわけではありません。
上記の画像のUSERSテーブルではid6の秋田犬さんの購入履歴がORDERSテーブルになく、反対にORDERSテーブルに新しく追加されたuser_id0の購入者はUSERSテーブルには登録されていません。
このような場合にテーブルを結合しても画像のように両方の情報が表示されるわけではなく、結合時にどちらのテーブルを参照するかを選択する必要があります。
その時の選択方法が『left join』または『right join』です。
- left outer joinは左のUSERSテーブルを参照することを意味しています。
- right outer joinは右のORDERSテーブルを参照することを意味しています。
外部結合で説明させていただいた内容は『left outer join』を利用した例となっています。
ですので、参照されたUSERSテーブルの情報をすべて確認することができるようになっています。
もし右側にあるORDERSテーブルを参照した場合には秋田犬さんのレコードは表示されません。
left outer joinをSQLで記述した場合
select * from users
left outer join orders
on users.id = orders.user_id;
コードの見方
right outer joinをSQLで記述した場合
select * from users
right outer join orders
on users.id = orders.user_id;