この単元では、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)」を『left join』を利用して結合しデータ取得すること。
- カラム
- 学生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)のすべてのデータ」を『right join』を利用して結合しデータ取得すること。
- 抽出条件なし
- カラム
- 学生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としては、間違いではないですが、「見やすさ=理解しやすい」を意識することが良いエンジニアだと思います。