この単元では、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としては、間違いではないですが、「見やすさ=理解しやすい」を意識することが良いエンジニアだと思います。