単元概要

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

重要なポイント

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

説明

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

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

 


 

  • 左:students_mst(学生マスタ)
  • 右:departments_mst(学科マスタ)

 


 

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

構文

inner join

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

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

<例題>

  • 学生マスタ(students_mst)と学科マスタ(departments_mst)を内部結合しデータを取得すること。
  • カラム
    • 学生ID(student_id)
    • 学生名(student_name)
    • 学生マスタの学科ID(department_id)
    • 学科名(department_name)
  • 結合条件
    • 学生マスタの学科ID(department_id)と学科マスタの学科ID(department_id)
  • 抽出条件なし
select
 sm.student_id
,sm.student_name
,sm.department_id
,gm.department_name
 from students_mst sm
 inner join departments_mst gm
 on sm.department_id = gm.department_id;

left join

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

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

<例題>

  • 「学生マスタ(students_mst)のすべてのデータと「学科マスタ(departments_mst)」を『left join』を利用して結合しデータ取得すること。
  • カラム
    • 学生ID(student_id)
    • 学生名(student_name)
    • 学生マスタの学科ID(department_id)
    • 学科名(department_name)
  • 結合条件
    • 学生マスタの学科ID(department_id)と学科マスタの学科ID(department_id)
  • 抽出条件なし
select
 sm.student_id
,sm.student_name
,sm.department_id
,gm.department_name
 from students_mst sm
 left join departments_mst gm
 on sm.department_id = gm.department_id;

right join

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

 

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

<例題>

  • 「学生マスタ(students_mst)」と「学科マスタ(departments_mst)のすべてのデータ『right join』を利用して結合しデータ取得すること。
  • 抽出条件なし
  • カラム
    • 学生ID(student_id)
    • 学生名(student_name)
    • 学生マスタの学科ID(department_id)
    • 学科名(department_name)
  • 結合条件
    • 学生マスタの学科ID(department_id)と学科マスタの学科ID(department_id)
select
 smstudent_id
,sm.student_name
,sm.department_id
,gm.department_name
 from students_mst sm
 right join departments_mst gm
 on sm.department_name = gm.department_name;

記述の注意点

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