💪

キン肉マンで学ぶテーブル結合

に公開

この記事は私が過去にQiitaへ投稿した内容をリライトしたものです

はじめに

今回はSQLを学び始めた人のためにテーブル結合について解説いたします。

テーブル結合とは?

その名の通りテーブル同士を結合することです。
データベースからレコードを取得する際、〇〇テーブルとXXテーブルのレコードを同時に取得したいなぁ...と思う時や、1つのテーブルだけでは情報が足りないから他のテーブルからも情報を引っ張ってこよう!と思うことがあります。
そんな時に使うのがJOINです。こんな感じに書きます↓

SELECT カラム名 
FROM テーブル1 
JOIN テーブル2 ON テーブル1.カラム名1 = テーブル名2.カラム名

実例を交えて見ていきましょう!

結合の種類

テーブル結合は内部結合と外部結合に大別できます。
目的によってSQLを書き分けるわけです。
また、下記の表のように省略形で記載することもできます。

結合方法 SQLでの記載方法 省略形
内部結合 INNER JOIN JOIN
外部結合 LEFT OUTER JOIN
または RIGHT OUTER JOIN
LEFT JOIN
RIGHT JOIN

INNER JOIN(内部結合)

テーブル同士を内部結合した場合、指定した条件に合致したレコードのみを取り出します。
これだけではよくわからないと思うので実例を示します。以下の2つのテーブルに対して、内部結合でレコードを取得してみましょう。

  • supermenテーブル
id name type_id
1 キン肉マン 1
2 悪魔将軍 2
3 ザ・マン 3
4 バッファローマン 5
  • groupsテーブル
id type
1 正義超人
2 悪魔超人
3 完璧超人
4 残虐超人
  • 実行するSQL
SELECT
supermen.id,
supermen.name,
groups.type
FROM supermen
JOIN groups ON supermen.type_id = groups.id
  • 実行結果
id name type
1 キン肉マン 正義超人
2 悪魔将軍 悪魔超人
3 ザ・マン 完璧超人

supermenテーブル.type_id と groupsテーブル.idで内部結合すると、groupsテーブル.idに5が存在しないため実行結果にバッファローマンは表示されません。
このように、結合可能なレコードが存在しない場合はレコードを取得しないのが内部結合です。

左外部結合

続いて左外部結合をみていきましょう。左外部結合をする上で、まず思い浮かぶのは「左って何?」だと思います。
これはSQL文でJOINの左側にあるテーブルを指しています。下記の例ではテーブル1ですね。同様に、右外部結合だとJOINの右側にあるテーブルなのでテーブル2を指しています。

SELECT カラム名 
FROM テーブル1
LEFT JOIN テーブル2 ON テーブル1.カラム名1 = テーブル名2.カラム名

それでは先程と同じテーブルを使って左外部結合をしてみましょう。

  • 実行するSQL
SELECT
supermen.id,
supermen.name,
groups.type
FROM supermen
LEFT JOIN groups ON supermen.type_id = groups.id
  • 実行結果
id name type
1 キン肉マン 正義超人
2 悪魔将軍 悪魔超人
3 ザ・マン 完璧超人
4 バッファローマン NULL

今回はバッファローマンのレコードが取得できましたね!
バッファローマンのtype_idはgroupsテーブルのidに存在しませんが、とりあえず取得しちゃうわけです。これが左外部結合です。

右外部結合

最後に右外部結合をやってみましょう。左外部結合が分かれば簡単です。
・実行するSQL

SELECT
supermen.id,
supermen.name,
groups.type
FROM supermen
RIGHT JOIN groups ON supermen.type_id = groups.id

・実行結果

id name type
1 キン肉マン 正義超人
2 悪魔将軍 悪魔超人
3 ザ・マン 完璧超人
NULL NULL 残虐超人

右外部結合だと、groupsテーブルから残虐超人のレコードが取得できましたね!
残虐超人のidはsupermenテーブルのtype_idに存在しませんが、左外部結合と同様にとりあえず取得しちゃうわけです。これが右外部結合です。

まとめ

キン肉マンを読んだことがある人はわかると思いますが、バッファローマンは初登場時は悪魔超人でした。
その後改心して正義超人になりましたが、完璧超人始祖編で再び悪魔超人となっています。
と思いきや、超神編の最後で調和の神の勢力に付き、コウモリ野郎と揶揄される始末...。
そんな背景があり、今回の記事ではバッファローマンの所属する勢力がgroupsテーブル上に存在しないことにしたわけです!

Discussion