さんかくすわりで書くブログ

勉強したこととか

【SQL】イメージで理解する「内部結合」「外部結合」

いまいち内部結合と外部結合を理解しないままほったらかしていたのだが、最近仕事で使ったときに調べて良い覚え方があったので備忘も兼ねて。

 参考にしたのはこちら↓

図でイメージするOracle DatabaseのSQL全集 第1回 さまざまな結合

 (SQLoracleを想定していますが、イメージで理解するのが目的なので構文は適宜読み替えるか調べてください。)

〇そもそも「結合」って?

複数のテーブルをまとめること。がっちゃんこ。

大きく分けて「内部結合」と「外部結合」がある。

 以下のテーブルを例にして説明する。

<会員テーブル>(結合元)

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は会員種別テーブルに存在しないのでデータは取得されないし、

会員種別名が "期間限定" の会員はいないのでデータは取得されない。

これをイメージで理解するとこんな感じ。

f:id:sankakusuwari:20190122015612p:plain

        会員テーブル      会員種別テーブル

〇外部結合って?

外部結合はさらに二つに分かれていて、「左外部結合」と「右内部結合」がある。

 〇左外部結合って?

統合元のレコードを軸にして、結合条件をもとにがっちゃんこする。

SQLはこんな感じ。

SELECT 会員テーブル.名前, 会員種別テーブル.会員種別名

FROM 会員テーブル

LEFT JOIN 会員種別テーブル

ON 会員テーブル.会員種別id = 会員種別テーブル.会員種別id

 さっそく結果。

名前 会員種別名
花子 無料
太郎 プレミアム
一郎 無料
次郎 NULL

結合元(会員テーブル)のレコードはすべて取得され、対応する結合先(会員種別テーブル)のレコードがない場合はNULLが入る。

左外部結合をイメージで理解するとこんな感じ。

f:id:sankakusuwari:20190122015658p:plain

         会員テーブル      会員種別テーブル

「外部結合」と言われれば、ほぼほぼ「左外部結合」のことだと思っていい。

〇右外部結合って?

結合先のレコードを軸にして、結合条件をもとにがっちゃんこする。

 基準にするテーブルが結合"元"から結合"先"になっただけ。

SQLはこんな感じ。

SELECT 会員テーブル.名前, 会員種別テーブル.会員種別名

FROM 会員テーブル

OUTER JOIN 会員種別テーブル

ON 会員テーブル.会員種別id = 会員種別テーブル.会員種別id

 実行結果。

名前 会員種別名
花子 無料
太郎 プレミアム
一郎 無料
NULL 期間限定

左外部結合とは逆に、結合元(会員種別テーブル)のレコードはすべて取得され、対応する結合元(会員テーブル)のレコードがない場合はNULLが入る。

右外部結合をイメージはこんな感じ。

f:id:sankakusuwari:20190122015715p:plain

        会員テーブル      会員種別テーブル

〇まとめ

SQLの結合はベン図で理解するとラク