テーブル結合

 


🍛 まず、そもそも「結合」って何?

イメージで言うと:

「別々の表(テーブル)をつなげて、ひとつの表として扱う」ことです。

たとえば、社員と部署が別々のテーブルにあるとき、

  • 社員テーブル ← 名前、部署番号、給料など

  • 部署テーブル ← 部署番号、部署名など

この2つを「部署番号」でつなげて1枚の表にするのがJOINです!


✅ ① 自然結合(NATURAL JOIN)とは?

共通の列名があると、それを自動で使って結合してくれる便利機能!

sql
SELECT * FROM 社員 NATURAL JOIN 部署;
  • 両方のテーブルに「部署番号」という列があれば、それを使って結合してくれる。

  • JOIN条件を省略できるので楽ちん。

  • ただし、列名が違っていると使えない

📌【ポイント】

  • 共通の列名がないとエラーになる

  • 複数あった場合は全部の列で結合される


✅ ② Using句(JOIN ... USING)とは?

結合に使う列名が同じとき、それを明示的に書く方法!

sql
SELECT * FROM 社員 JOIN 部署 USING (部署番号);
  • 部署番号 という列をキーにして結合するよ!って明示する。

  • ON よりもシンプルでスッキリ

  • 結果に表示されるときは、部署番号 は1回だけ出る(重複しない)。

📌【ポイント】

  • 列名が同じじゃないと使えないUSING (部署ID) は両方に存在する必要あり!

  • 複数列も指定できる: USING (部署番号, 拠点ID)


✅ ③ 外部結合(OUTER JOIN)とは?

片方のデータがなくても結果に出してくれるやさしいJOIN!

たとえば、「社員はいるけど、まだ部署が決まってない人」も結果に出したいとき。

sql
SELECT * FROM 社員 LEFT OUTER JOIN 部署 ON 社員.部署番号 = 部署.部署番号;
  • LEFT:左の表(社員)を必ず表示する

  • RIGHT:右の表(部署)を必ず表示

  • FULL:両方とも表示(Oracleで使用可能)

📌【ポイント】

  • Oracleでは OUTER は省略可能: LEFT JOIN でもOK

  • NULLが返る列に注意(結合先にデータがないとNULLになる)


✅ ④ 非等価結合とは?

JOINといえば「=」ですが、これは=`以外を使ってつなぐ結合。

たとえば「給料テーブル」に「給与ランク範囲」があって、社員の給料がどのランクか調べたいとき。

sql
SELECT 社員.名前, 給与ランク.ランク FROM 社員 JOIN 給与ランク ON 社員.給料 BETWEEN 給与ランク.最低 AND 給与ランク.最高;

📌【ポイント】

  • BETWEENや<, >などの条件もJOINに使える

  • 主キー/外部キー以外の関係でも結合可能


✅ ⑤ 自己結合(Self Join)とは?

同じテーブル同士をJOINする。つまり、テーブルを2回使う

たとえば、社員の「上司」を調べたい場合。

sql
SELECT A.名前 AS 社員, B.名前 AS 上司 FROM 社員 A JOIN 社員 B ON A.上司ID = B.社員ID;
  • 別名(エイリアス)をつけるのがポイント

  • 同じテーブル内の親子関係、上下関係を表すのに便利

📌【ポイント】

  • 別名をつけないとどっちの列かわからなくなる

  • 複雑な表現に見えるが中身は普通のJOIN


✅ ⑥ クロス結合(CROSS JOIN)とは?

全ての組み合わせを作るJOIN

たとえば「全社員が全支店に出張できる可能性を調べる」みたいなとき。

sql
SELECT * FROM 社員 CROSS JOIN 支店;
  • 社員が10人、支店が5つ → 10×5=50行のデータになる!

📌【ポイント】

  • 結合条件がないので完全なかけ算

  • 実務ではほぼ使わない(間違って書くと暴走する💦)



前の記事:Group関数・Group by句・Having句