キン肉マンで学ぶテーブル結合
* この記事は私が過去に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