ガラシのパルプンテ頼み

地方産限界エンジニアのグローバル独り言

【初心者でも怖くない】結合とは?内部結合と外部結合の違い | データベース入門

はじめに

データベースやSQLについて学んでいくと必ずエンカウントするのが「内部結合」「外部結合」

結合という単語からも、どちらも複数のテーブルをまとめることであることは間違いありませんが、 「内部とか外部とか具体的な違いがわからない」「なんとなくは分かっているけど言語化して説明できるほどではない」 そんな初学者に向けて今回はそもそものテーブルの結合とはなんなのかという部分から掘り下げてみようと思います。

テーブルの結合とは

データベースからなんらかのデータを取得する場合「◯◯テーブルから☓☓データを取り出す」というSELECT文を用いますね。 そしてこのデータ取得は単一のテーブルのみを対象とする場合もあれば、複数のテーブルを対象に取得するケースも少なくありません。

例えば商品と仕入先マスタという二つのテーブルがあるとします。ある商品の仕入先名を知るために

  1. 商品テーブルから仕入先名を知りたい商品データを検索する
  2. 商品データが有する仕入先IDで仕入先マスタテーブルを検索する
  3. 2つの検索結果を足しわせる

という工程を毎回踏んでいては効率が良くありません。

そのため通常の検索の場合、以下のような方法をとります。

  1. 商品テーブルと仕入先マスタテーブルをまとめる
  2. まとめて一つとなったテーブルに対して検索

この「まとめる」作業のことを「結合」と呼び、その結合の種類として内部結合外部結合が存在しています。

内部結合とは

内部結合とは、結合条件に指定している値が両方のテーブルに存在するデータを抽出する結合のことです。

以下は商品テーブルと仕入先マスタテーブルを「商品.仕入先ID = 仕入先マスタ.ID」の条件で内部結合した結果です。

内部結合した結果、結合条件である「仕入先ID」が両方のテーブルに存在している商品ID=1と商品ID=2のデータが抽出されています。 内部結合は、SQLのINNER JOIN句もしくはWHERE句により実現することができます。

■INNER JOINを使った例

SELECT * 
FROM products 
INNER JOIN suppliers 
ON products.supplier_id = suppliers.id;

■WHEREを使った例

SELECT * 
FROM products, suppliers 
WHERE products.supplier_id = supplier.id;

(products = 商品テーブル suppliers = 仕入先マスタテーブル)

外部結合とは

外部結合とは、基準となるテーブルに存在すれば抽出する結合のことです。 どちらのテーブルを基準にするかを指定し、その基準となるテーブルに存在するデータを抽出、基準ではないテーブルからは抽出できるデータのみ取得します。

外部結合には基準にするテーブルに応じて「左外部結合」「右外部結合」「完全外部結合」の三つの種類が存在します。 これらについて順を追って説明します。

左外部結合とは(LEFT OUTER JOIN)

左側のテーブルを基準とするのが左外部結合(LEFT OUTER JOIN)です。 以下は商品テーブルと仕入先マスタテーブルを「商品.仕入先ID = 仕入先マスタ.ID」の条件で左外部結合した結果です。

左外部結合した結果、基準となる商品テーブルに存在する全データを抽出し、仕入先マスタテーブルからは条件に一致したデータを抽出しています。 仕入先IDが商品テーブルにしか存在しない、仕入先ID「50」のレコードについては、仕入先名が空白となり、商品テーブルの項目である商品ID、商品名、仕入先IDしか抽出されていません。

左外部結合は、SQLのLEFT OUTER JOIN句を使用します。

■LEFT OUTER JOINを使った例(OUTERは省略可)

SELECT * 
FROM products
LEFT OUTER JOIN suppliers
ON products.supplier_id = suppliers.id;

右外部結合(RIGHT OUTER JOIN)

右側のテーブルを基準とするのが右外部結合です。 以下は商品テーブルと仕入先マスタテーブルを「商品.仕入先ID = 仕入先マスタ.ID」の条件で右外部結合した結果です。

右外部結合した結果、基準となる仕入先マスタテーブルに存在する全データを抽出し、商品テーブルからは条件に一致したデータを抽出しています。 仕入先IDが仕入先マスタテーブルにしか存在しない仕入先ID「10」のレコードは、商品IDと商品名が空となり、仕入先マスタテーブルの項目である仕入先ID、仕入先名しか抽出されていません。

右外部結合は、SQLのRIGHT OUTER JOIN句を使用します。

■RIGHT OUTER JOINを使った例(OUTERは省略可)

SELECT * 
FROM products
RIGHT OUTER JOIN suppliers
ON products.supplier_id = suppliers.id;

完全外部結合(FULL OUTER JOIN)

完全外部結合は両方のテーブルを基準とし、それぞれに一致しないレコードも抽出結果として含めます。 以下は商品テーブルと仕入先マスタテーブルを「商品.仕入先ID = 仕入先マスタ.ID」の条件で完全外部結合した結果です。

仕入先IDが一致しないデータも含んだ、商品テーブル・仕入先マスタテーブルの両テーブルに存在するデータを抽出しています。

完全外部結合は、SQLのFULL OUTER JOIN句を使用します。

■FULL OUTER JOINを使った例(OUTERは省略可)

SELECT *
FROM products
FULL OUTER JOIN suppliers
ON products.supplier_id = suppliers.id

まとめ

結合種別 特徴
結合 複数のテーブルをまとめて、あたかも一つのテーブルとして扱えるようにすること。
内部結合 結合条件に指定している値が両方のテーブルに存在するデータを抽出する結合のこと
外部結合 結合条件として指定している値が基準となるテーブルに存在すれば抽出する結合のこと
左外部結合 左側のテーブルを基準に行う外部結合のこと
右外部結合 右側のテーブルを基準に行う外部結合のこと
完全外部結合 両側のテーブルを基準に行う外部結合のこと