単元概要

この単元では、SELECT文を利用し、複数テーブルを結合および結果表示します。「inner join」「left join」「right join」という構文を学びます。

重要なポイント

「inner」「left」「right」の違いを把握しよう!
そして、どのカラム同士で接続しているのかがポイント!

説明

複数のテーブルを結合するときには、どのカラムを使用しているのかを理解するところから始めます。下記の場合だと、「井田 和義」さんの「学科」はどれでしょうか?答えは「ペットビジネス学科」です。

あなたは、どのようにそれが分かりましたか?きっと、「gakka_no」同士の番号を見比べながら判断したと思います。テーブル結合では、テーブル同士をどのカラムを利用するかが大事です。

 


 

  • 左:student_mst(学生マスタ)
  • 右:gakka_mst(学科マスタ)

 


 

この学生マスタと学科マスタの2つを「gakka_no」で結びつけてみると、下記のようになります。
それぞれの番号で結びついたり、逆に結びついていないものもありますよね。このデータの関係をしっかりと覚えておいてください。

構文

inner join

inner joinは、内部結合と呼ばれています。「結合条件に合わないデータは取得しない」結果となります。
下記の結果では、学生マスタと学科マスタの学科NOが結びついたデータのみが表示されています。

select
 [別名A].[カラム名1]
,[別名B].[カラム名2]
 from [テーブル名A] [別名A]
 inner join [テーブル名B] [別名B]
 on [別名A].[結合カラム名A] = [別名B].[結合カラム名B];

<例題>

  • 学生マスタ(student_mst)と学科マスタ(gakka_mst)を内部結合しデータを取得すること。
  • カラム
    • 学生NO(student_no)
    • 学生名(student_kj)
    • 学生マスタの学科NO(gakka_no)
    • 学科名(gakka_kj)
  • 結合条件
    • 学生マスタの学科NO(gakka_no)と学科マスタの学科NO(gakka_no)
  • 抽出条件なし
select
 sm.student_no
,sm.student_kj
,sm.gakka_no
,gm.gakka_kj
 from student_mst sm
 inner join gakka_mst gm
 on sm.gakka_no = gm.gakka_no;

left join

left joinは、左外部結合と呼ばれています。「結合条件に合わなくても左テーブルのデータをすべて表示する」結果となります。
下記の結果では、学生マスタと学科マスタの学科NOが結びついたデータ以外にも、student_mstのデータすべてが表示されています。
※データベースによって、表記(left outer join)が異なります。

select
 [別名A].[カラム名1]
,[別名B].[カラム名2]
 from [テーブル名A] [別名A]
 left join [テーブル名B] [別名B]
 on [別名A].[結合カラム名A] = [別名B].[結合カラム名B];

<例題>

  • 「学生マスタ(student_mst)のすべてのデータと「学科マスタ(gakka_mst)」を結合しデータ取得すること。
  • カラム
    • 学生NO(student_no)
    • 学生名(student_kj)
    • 学生マスタの学科NO(gakka_no)
    • 学科名(gakka_kj)
  • 結合条件
    • 学生マスタの学科NO(gakka_no)と学科マスタの学科NO(gakka_no)
  • 抽出条件なし
select
 sm.student_no
,sm.student_kj
,sm.gakka_no
,gm.gakka_kj
 from student_mst sm
 left join gakka_mst gm
 on sm.gakka_no = gm.gakka_no;

right join

right joinは、右外部結合と呼ばれています。「結合条件に合わなくても右テーブルのデータをすべて表示する」結果となります。
下記の結果では、学生マスタと学科マスタの学科NOが結びついたデータ以外にも、gakka_mstのデータすべてが表示されています。
※データベースによって、表記(right outer join)が異なります。

 

select
 [別名A].[カラム名1]
,[別名B].[カラム名2]
 from [テーブル名A] [別名A]
 right join [テーブル名B] [別名B]
 on [別名A].[結合カラム名A] = [別名B].[結合カラム名B];

<例題>

  • 「学生マスタ(student_mst)」と「学科マスタ(gakka_mst)のすべてのデータを結合しデータ取得すること。
  • 抽出条件なし
  • カラム
    • 学生NO(student_no)
    • 学生名(student_kj)
    • 学生マスタの学科NO(gakka_no)
    • 学科名(gakka_kj)
  • 結合条件
    • 学生マスタの学科NO(gakka_no)と学科マスタの学科NO(gakka_no)
select
 sm.student_no
,sm.student_kj
,sm.gakka_no
,gm.gakka_kj
 from student_mst sm
 right join gakka_mst gm
 on sm.gakka_no = gm.gakka_no;

記述の注意点

テーブル結合する際に記述する「結合条件」は、テーブルの順番に併せて記述するように意識してみましょう。SQLとしては、間違いではないですが、「見やすさ=理解しやすい」を意識することが良いエンジニアだと思います。