いまいち内部結合と外部結合を理解しないままほったらかしていたのだが、最近仕事で使ったときに調べて良い覚え方があったので備忘も兼ねて。
参考にしたのはこちら↓
図でイメージするOracle DatabaseのSQL全集 第1回 さまざまな結合
(SQLはoracleを想定していますが、イメージで理解するのが目的なので構文は適宜読み替えるか調べてください。)
〇そもそも「結合」って?
複数のテーブルをまとめること。がっちゃんこ。
大きく分けて「内部結合」と「外部結合」がある。
以下のテーブルを例にして説明する。
<会員テーブル>(結合元)
id | 名前 | 会員種別cd |
---|---|---|
001 | 花子 | 01 |
002 | 太郎 | 02 |
003 | 一郎 | 01 |
004 | 次郎 | 04 |
<会員種別テーブル>(結合先)
会員種別id | 会員種別名 |
---|---|
01 | 無料 |
02 | プレミアム |
03 | 期間限定 |
〇内部結合って?
結合条件を満たすデータだけ取ってきてがっちゃんこする。
まずはSQLを見てみる。
SELECT 会員テーブル.名前, 会員種別テーブル.会員種別名
FROM 会員テーブル
INNER JOIN 会員種別テーブル
ON 会員テーブル.会員種別id = 会員種別テーブル.会員種別id
このSQLでいう結合条件(ON句)は、
「会員テーブルと会員種別テーブル両方の会員種別idが等しい」
この条件に当てはまるレコードだけ取ってきてがっちゃんこする。
結果はこんな感じ。
名前 | 会員種別名 |
---|---|
花子 | 無料 |
太郎 | プレミアム |
一郎 | 無料 |
次郎さんの会員種別idは会員種別テーブルに存在しないのでデータは取得されないし、
会員種別名が "期間限定" の会員はいないのでデータは取得されない。
これをイメージで理解するとこんな感じ。
会員テーブル 会員種別テーブル
〇外部結合って?
外部結合はさらに二つに分かれていて、「左外部結合」と「右内部結合」がある。
〇左外部結合って?
統合元のレコードを軸にして、結合条件をもとにがっちゃんこする。
SQLはこんな感じ。
SELECT 会員テーブル.名前, 会員種別テーブル.会員種別名
FROM 会員テーブル
LEFT JOIN 会員種別テーブル
ON 会員テーブル.会員種別id = 会員種別テーブル.会員種別id
さっそく結果。
名前 | 会員種別名 |
---|---|
花子 | 無料 |
太郎 | プレミアム |
一郎 | 無料 |
次郎 | NULL |
結合元(会員テーブル)のレコードはすべて取得され、対応する結合先(会員種別テーブル)のレコードがない場合はNULLが入る。
左外部結合をイメージで理解するとこんな感じ。
会員テーブル 会員種別テーブル
「外部結合」と言われれば、ほぼほぼ「左外部結合」のことだと思っていい。
〇右外部結合って?
結合先のレコードを軸にして、結合条件をもとにがっちゃんこする。
基準にするテーブルが結合"元"から結合"先"になっただけ。
SQLはこんな感じ。
SELECT 会員テーブル.名前, 会員種別テーブル.会員種別名
FROM 会員テーブル
OUTER JOIN 会員種別テーブル
ON 会員テーブル.会員種別id = 会員種別テーブル.会員種別id
実行結果。
名前 | 会員種別名 |
---|---|
花子 | 無料 |
太郎 | プレミアム |
一郎 | 無料 |
NULL | 期間限定 |
左外部結合とは逆に、結合元(会員種別テーブル)のレコードはすべて取得され、対応する結合元(会員テーブル)のレコードがない場合はNULLが入る。
右外部結合をイメージはこんな感じ。
会員テーブル 会員種別テーブル
〇まとめ