【楽しく学ぶSQL入門】第8章:結合

公開日:
更新日:

システム開発の現場では、単一のテーブルから値を取得することはほとんどなく、複数のテーブルに分散したデータを組み合わせて活用するケースが圧倒的に多いです。このように、複数の表を一つに繋ぎ合わせる操作を結合と言います。実際のシステム開発でのデータベース設計に深く関わる重要な仕組みなので、基本から丁寧に確認していきましょう。

結合の基本構文

SELECT 選択列リスト
FROM テーブルA
INNER JOIN テーブルB
ON 両テーブルの結合条件
※SELECT句の選択列リストには両テーブルの列を指定可能。

① 例)社員テーブルとグループテーブルを結合し、社員名と所属グループ名を取得する。

SELECT ep.name1, ep.name2, cg.name
FROM employee AS ep
INNER JOIN company_group AS cg
ON ep.group_id = cg.group_id ;

name1 name2 name
山田 次郎 システム開発部
佐藤 花子 人事総務部

INNER JOINというキーワードを用いずにテーブルを結合する方法もあります。古いシステムなどで見られる書き方。

SELECT 選択列リスト
FROM テーブルA,テーブルB
WHERE 両テーブルの結合条件

② 例)FROM句に複数のテーブルを並べて結合し、社員名と所属グループ名を取得する。

SELECT ep.name1, ep.name2, cg.name
FROM employee AS ep, company_group AS cg
WHERE ep.group_id = cg.group_id ;

※使用する場合は、以下の点に注意
・全てのテーブルをFROM句に並列で記述するため、主となるテーブルがどれなのかがわかりにくくなる。
・WHERE句には絞り込み条件も記述するため、結合条件がどれなのかわかりにくくなる。

可読性を損なう恐れがあるため、基本的にはINNER JOINを使うことが推奨されています。

参考サイト:MySQL 公式サイト(JOIN 構文)

外部結合

INNER JOINを使った通常の結合方法だと、指定した他方のテーブルの値がNULLの場合は、列が検索されて来ないという特徴があります。そこで登場するのが外部結合。他方の値がNULL又は存在しない場合でも検索することが可能になります。データの欠損を防ぎたい場面で非常に有効な手法と言えます。

まずは、通常のINNER JOINで特定のID以降の社員データを取得してみましょう。グループに未所属の社員がいる場合、その行は出力から除外されてしまいます。

③ 例)INNER JOINを用いてIDが30以上の社員の結合データを取得する。

SELECT ep.employee_id, ep.group_id, ep.name1, ep.name2, cg.name 
FROM employee ep
INNER JOIN company_group cg 
ON ep.group_id = cg.group_id 
WHERE employee_id >= 30;

employee_id group_id name1 name2 name
30 1 山田 次郎 システム開発部

これに対し、左側のテーブル(FROM句に書いた表)のデータを主軸とし、右側の値がNULLであっても強制的に全行を抽出するのが 「左外部結合」です。記述スタイルを確認しましょう。


SELECT 選択列リスト
FROM 左表の名前
LEFT OUTER JOIN 右表の名前
ON 結合条件

④ 例)LEFT OUTER JOINを用いてグループ未所属の社員も含めてデータを取得する。

SELECT ep.employee_id, ep.group_id, ep.name1, ep.name2, cg.name
FROM employee ep 
LEFT OUTER JOIN company_group cg 
ON ep.group_id = cg.group_id 
WHERE employee_id >= 30;

employee_id group_id name1 name2 name
30 1 山田 次郎 システム開発部
31 NULL 鈴木 一郎 (NULL) ※大阪支社所属(未割当)

今度は、右側のテーブル(JOINの後ろに書いた表)を主軸としてデータを合流させる 「右外部結合」の構造です。


SELECT 選択列リスト
FROM 左表の名前
RIGHT OUTER JOIN 右表の名前
ON 結合条件

⑤ 例)RIGHT OUTER JOINを用いて対応する社員がいないグループも含めてデータを取得する。

SELECT ep.employee_id, ep.group_id, ep.name1, ep.name2, cg.name
FROM employee ep 
RIGHT OUTER JOIN company_group cg 
ON ep.group_id = cg.group_id
ORDER BY employee_id;

employee_id group_id name1 name2 name
30 1 山田 次郎 システム開発部
(NULL) (NULL) (NULL) (NULL) 新規プロジェクト準備室

最後に、左右のテーブルの双方に存在する未合致データをすべて含めて抽出する、 「完全外部結合」の仕様がこちら。

SELECT 選択列リスト
FROM 左表の名前
FULL OUTER JOIN 右表の名前
ON 結合条件

※MySQLでは直接FULL OUTER JOINは利用できない場合があります。そのためシステム開発現場で完全外部結合と同等の結果が欲しい場合は、LEFT JOINとRIGHT JOINの双方をUNION句で連結するなどの代替アプローチを採るのが一般的。

SELECT 選択列リスト
FROM テーブルA, テーブルB
WHERE テーブルAの結合条件列 = テーブルBの結合条件列(+)

これで左外部結合になる。

自己結合(再帰結合)

結合は異なるテーブル間で行うことが一般的ですが、自分自身と結合されることも可能です。同一テーブル同士を結合することを自己結合再帰結合です。社員データとその上司のデータを結びつけるような組織ツリーの階層表現などで多用される設計技法となっています。

非等価結合

結合の条件に等価記号を用いた結合条件を指定することがほとんどですが、= 以外の演算子を用いた条件式も記述できます。このような結合を非等価結合と呼びます。金額に応じた評価ランクをマスタから引っ張るなど、範囲にグラデーションを持たせてデータを紐解く際に極めて有効な選択肢です。

お問い合わせ

CONTACT

業務システムに関するお困りごと、WEBサイトの制作など、
まずはお気軽にお問い合わせください。

会員サイト
CONTACT
06-6305-2278
採用サイトはこちらRECRUIT