Webサイト制作コースのお申し込みはこちら Webサイト制作コースのお申し込みはこちら

SQLでテーブル結合といえば、異なるテーブルまたはビューとの結合処理のことを指しますが、同一テーブルを結合(自己結合)することも可能です。

利用用途がわかりにくいこともあり、頻繁には利用されていない機能ではありますが、自己結合を使いこなせることでスキルの幅が広がります。

今回はSQLの自己結合について、役割と基本的な使い方をサンプルコードを掲載しながらご紹介していきます。

ポテパンダの一言メモ

記事内で掲載するサンプルコードはMySQLデータベースを利用して動作検証しております。
データベースによっては実行出来ない可能性もありますのでご認識ください。

SQLの自己結合って何?


SQLの自己結合は、1つのテーブルを自分自身と結合する処理のことを指します。

結合といえば、2つ以上のテーブル間で実施される方法が一般的ではありますが、SQLの仕様上、結合元のテーブルと結合先のテーブルが同一テーブルであっても問題ありません。

同一テーブル名・同一カラム名のテーブルが2つあると仮定して、テーブル結合を実施するようなイメージです。

主な利用用途とは

SQLで自己結合を行う主な利用用途としては、「循環リレーションシップ」への対応が挙げられます。

自身のテーブル内に存在する列を、外部キーとして結合させるイメージで利用されます。

自己結合を利用すれば、同一テーブルのデータで新たなテーブルを組み直すようなイメージで、ひと目でデータを確認しやすい構造に作り変えることが可能です。

自己結合の考え方

テーブル結合といえば、「内部結合(INNER JOIN)」「外部結合(OUTER JOIN)」などが挙げられますが、自己結合はこれらの結合とは少し考え方が違います。

自己結合はあくまで1つのテーブルで結合処理を行うということであり、上述した結合の種類は問いません。

つまり自己結合では、1つのテーブルで外部結合や内部結合またはクロス結合を実施するというのが正しい考え方です。

SQLで自己結合する方法


SQLで自己結合を行う基本的な使い方について確認していきましょう。

内部結合

自己結合で内部結合を行う際の記述方法は下記の通りです。

SELECT テーブルの別名.カラム名[, テーブルの別名.カラム名, ....]
FROM テーブル名 [AS] 別名1
INNER JOIN テーブル名 [AS] 別名2
ON 別名2.カラム名 = 別名1.カラム名
[WHERE 条件式];
ポテパンダの一言メモ

自己結合では同一テーブルを結合するため、必ずテーブルに別名を付与する必要があります。

全く同じテーブルの場合、データベースがどちらのテーブルのデータなのか、自動的に判断することが出来ないためです。

外部結合

自己結合で外部結合を行う際の記述方法は下記の通りです。

SELECT テーブル名.カラム名[, テーブル名.カラム名, ....]
FROM テーブル名 [AS] 別名1
LEFT JOIN テーブル名 [AS] 別名2
ON 別名2.カラム名 = 別名1.カラム名
[WHERE 条件式];

SQLの自己結合サンプル


では実際にサンプルSQLで動きの確認を行っていきましょう。

サンプルテーブル

今回サンプルとして「parents」テーブルを下記のデータで作成しています。

+------+--------------------+-----------+
| id   | name               | couple_id |
+------+--------------------+-----------+
|    1 | 山田としお           |         4 |
|    2 | 佐藤しおり           |         5 |
|    3 | 伊藤まさし           |      NULL |
|    4 | 山田花子            |         1 |
|    5 | 佐藤たかひろ         |         2 |
+------+--------------------+-----------+

内部結合のサンプル

実際にサンプルテーブルを使用して内部結合の自己結合を実施してみましょう。

SELECT A.id AS ID, A.name AS 名前, B.id AS 配偶者ID, B.name AS 配偶者名
FROM parents A
INNER JOIN parents B
ON B.id = A.couple_id;

実行した結果が下記の通りです。

+------+--------------------+-------------+--------------------+
| ID   | 名前                | 配偶者ID     | 配偶者名            |
+------+--------------------+-------------+--------------------+
|    4 | 山田花子            |           1 | 山田としお            |
|    5 | 佐藤たかひろ         |           2 | 佐藤しおり            |
|    1 | 山田としお           |           4 | 山田花子             |
|    2 | 佐藤しおり           |           5 | 佐藤たかひろ          |
+------+--------------------+-------------+--------------------+

同一テーブルですが、テーブル結合により表示内容を変更したことで、一見してデータを確認しやすくなりました。

外部結合のサンプル

全く同じサンプルデータを今度は外部結合の自己結合で動作確認してみましょう。

SELECT A.id AS ID, A.name AS 名前, B.id AS 配偶者ID, B.name AS 配偶者名
FROM parents A
LEFT JOIN parents B
ON B.id = A.couple_id;

実行した結果が下記の通りです。

+------+--------------------+-------------+--------------------+
| ID   | 名前                | 配偶者ID    | 配偶者名             |
+------+--------------------+-------------+--------------------+
|    4 | 山田花子             |           1 | 山田としお           |
|    5 | 佐藤たかひろ          |           2 | 佐藤しおり           |
|    1 | 山田としお            |           4 | 山田花子            |
|    2 | 佐藤しおり            |           5 | 佐藤たかひろ         |
|    3 | 伊藤まさし            |        NULL | NULL               |
+------+--------------------+-------------+--------------------+

外部結合ですので、軸となるテーブル情報が全て取得された上で、存在しないデータに関してはNULLが表示されています。

さいごに:SQLの自己結合は知識として把握しておこう


本記事では、SQLの自己結合について、考え方と使い方をご紹介してきました。

実務において、自己結合が利用されている場面はあまり見かけませんが、知識としては知っておきたい内容です。

自己結合については、SQLの経験が浅い状態の方ほど、内部結合や外部結合と同列で考えてしまいがちですが、同一テーブルでも結合処理を行うことが出来るとだけ認識しておけば、シンプルに考えやすいかと思います。

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。