SQLの基本とも言えるテーブル結合、その種類と使い方について解説
  • facebookページ
  • twitterページ
  • 2019.11.02

    SQLの基本とも言えるテーブル結合、その種類と使い方について解説

    SQLの基本とは、複数のテーブルから関連するデータを集めて結合し、さらに条件に合うデータを抽出することです。今回は、SQLの基本と言えるテーブル結合の種類とその使い方について、簡単な例を紹介しながら解説します。

    SQLにおけるテーブル接合とは

    データベースからデータを取り出すSQLを考える際、条件に合わせてデータを並べた表をイメージすると分かりやすいでしょう。例えば、Webシステムなどでプログラムからデータベースを利用する場合は、既存のテーブルからデータを取り出し、イメージした表をプログラムで作ることは可能です。しかし、その処理をSQLでにやらせてみてはいかがでしょうか。複数のテーブルに格納されたデータを集めてイメージ通りの表を出力できれば、プログラム側での処理も簡単に組めます。

    SQLで、このような複数のテーブルに格納されたデータを集めた表を作る処理を「結合」と呼びます。この機能は、データベースではよく使われるので、SQLを学ぶのなら、ぜひ、「結合」の使い方をマスターしましょう。まずは、SQLにおける「結合」の意味について解説します。

    2つのテーブルから1つのテーブルを作る考え方

    実際のSQLでは、幾つものテーブルからデータを抜き出して、1つのテーブルを作りますが、その基本は2つのテーブルから1つのテーブルを作る方法です。例えば、共通のidを持つ、2つのテーブルがあったとします。この2つのテーブルを結合して1つのテーブルにした場合は、IDに合わせて次のように結合されます。

    なお、ここのポイントは、この2つのテーブルの要素は、共通のidによって1対1で繋がる点です。この2つのテーブルは、共通のIDによって関連付けされているとして結合されます。

    リレーショナルデータベースはSQLの基本

    このように、関連付けされたデータを持つデータベースのことをリレーショナルデータベースと呼びます。そして、今のSQLが使えるデータベースの基本と言えます。例えば、一般的にテーブルを設計する際、まずユニークなIDを設定し、その後に、idに関連付けされた情報を並べるのが基本です。そして、このIDは、他のテーブルで使われることで、テーブル同志が関連付けされます。

    SQLを学ぶ方の中には、Microsoft Officeに含まれるMS-Accessで、SQLが使えることを知っている方もいるでしょう。MS-Accessのクエリーは、SQLをグラフィカルで表現したものです。そして、複数のテーブルの情報の連携を線で結ぶことで表現できます。これが、リレーショナルの基本であり、結合ではこの関係を使って表を連結します。

    SQLで結合する方法1つではない

    リレーショナルデータベースの基本は、格納されているデータは関連付けされており、その関連を使って結合することで、複数のテーブルから1つのテーブルを作れます。しかし、SQLを使ってデータを結合する方法は1つではありません。ベースになるテーブルの右側に別のテーブルを結合する方法と、左側に結合する方法は、SQLでは別のコマンドです。さらに、結合するテーブルにデータが無い場合、ベースになったテーブルのデータを除外する方法と、追加した箇所を空白にする方法があります。そのため、データベースから取り出したい表のイメージをしっかり持ち、それを実現するためのSQLを作りま
    しょう。

    SQLで使える結合は5つ

    SQLで使えるテーブルの結合のやり方は、inner joinと、3通りのouter join、さらにcross joinの5つです。ただし、Webシステムでよく使われるオープンソースのデータベース管理ソフトのMySQLは、full outer join は使えません。とはいえ、他のデータベース管理ソフトから移植することもあります。SQLを使う機会のあるWebエンジニアの方は、ぜひ、理解しておきましょう。

    内部結合 INNER JOIN

    INNER JOINは、結合するテーブルのデータのうち、条件に指定したカラムの値が一致するデータのみを結合します。

    この例では、table1 と table2 の2つのテーブルを、それぞれのidが一致しているデータのみ結合します。
    では、下記のtable1とtable2で、INNER JOINを実行してみましょう。

    table1の要素
    id name
    1 鈴木
    2 佐藤
    3 田中
    4 山本

    table2の要素
    id section
    1 営業
    2 総務
    5 経理

    SQLの結果は、次のとおりです。

    id name id section
    1 鈴木 1 営業
    2 佐藤 2 総務

    table1にあって、table2に一致するidが無かった「3 田中」と「4 山本」の2行は除外されます。また、table2にあるものの、tabl2に一致するidが無かった「5 経理」も除外です。そして、table1のidと、table2のidが一致している2行だけが出力されます。

    外部結合 LEFT OUTER JOIN

    LEFT OUTER JOINは、左側のテーブルを全て取り出し、その右側のテーブルのうち、条件に指定したカラムの値が一致するデータのみ結合します。なお、右側に結合するテーブルに一致するカラムが無い場合は、NULLが入ります。

    この例では、tanble1が左側のテーブルとして全て取り出され、また、table2がそれに結合するテーブルであり、条件に一致するデータが取り出され、該当しない場合はnullが入ります。そして、先ほどと同じ例で出力した結果が次のとおりです。

    table1の要素
    id name
    1 鈴木
    2 佐藤
    3 田中
    4 山本

    table2の要素
    id section
    1 営業
    2 総務
    5 経理

    SQLの結果です。

    id name id section
    1 鈴木 1 営業
    2 佐藤 2 総務
    3 田中 null null
    4 山本 null null

    まず、table1のデータは全て出力されます。そして、idが一致するtable2のデータが結合されますが、idが一致しない「3 田中」と「4 山本」のtable2のデータには、nullが入ります。

    外部結合 RIGHT OUTER JOIN

    RIGHT OUTER JOIN は、右側のテーブルを全て取り出し、その左側のテーブルのうち、条件に指定したカラムの値が一致するデータのみ結合します。なお、左側に結合するテーブルに一致するカラムが無い場合は、NULLが入ります。

    この例では、tanble2が右側のテーブルとして全て取り出され、また、table1がそれに結合するテーブルであり、条件に一致するデータが取り出され、該当しない場合はnullが入ります。

    table1の要素
    id name
    1 鈴木
    2 佐藤
    3 田中
    4 山本

    table2の要素
    id section
    1 営業
    2 総務
    5 経理

    SQLの結果です。

    id name id section
    1 鈴木 1 営業
    2 佐藤 2 総務
    null null 5 経理

    この場合、全てのデータが出力されるのはtable2です。そして、idが一致するtable1のデータが結合されますが、idが一致しない「5 経理」に関しては、table1のデータとしてnullが入ります。

    外部結合 FULL OUTER JOIN

    FULL OUTER JOINは、これまで紹介した LEFT OUTER JOINやRIGHT OUTER JOINと同じように、2つのテーブルを結合し、左右両方で該当するデータが無い場合はnullを入れる方法です。

    具体的に、次のテーブルを結合した例が次のとおりです。

    table1の要素
    id name
    1 鈴木
    2 佐藤
    3 田中
    4 山本

    table2の要素
    id section
    1 営業
    2 総務
    5 経理

    SQLの結果です。

    id name id section
    1 鈴木 1 営業
    2 佐藤 2 総務
    3 田中 null null
    4 山本 null null
    null null 5 経理

    この場合、table1とtable2を、idが同じ場合は該当するデータを結合します。また、同時にそれぞれに片方にしかデータが無いデータも出力し、無いデータにはnullを入れます。

    交差結合 CROSS JOIN

    INNER JOINとOUTER JOINは、2つのテーブルを横に結合しましたが、CROSS JOINは全く別の結合方法で、2つのテーブルの行の全ての組み合わせを出力する方法です。

    この例では、table1とtible2の全ての組み合わせが出力されます。このまま出力するのではなく、さらに別のSQLと組み合わせて、リストを作るのに使われます。

    table1の要素
    year
    2018
    2019

    table2の要素
    item
    費目1
    費目2
    費目3

    SQLの結果です。

    year item
    2018 費目1
    2018 費目2
    2018 費目3
    2019 費目1
    2019 費目2
    2019 費目3

    SQLで使える5つの結合
    • INNER JOIN
    • LEFT OUTER JOIN
    • RIGHT OUTER JOIN
    • FULL OUTER JOIN
    • CROSS JOIN

    結合順序と結合条件について

    実際のSQLでは、2つのテーブルのデータだけを結合するのは稀で、3つ以上のテーブルにあるデータを結合してリストを作成のが一般的です。そして、テーブルを結合する場合、結合する順序と条件をよく考えないと、期待したリストが出力されません。そこで、次からSQLで複数のテーブルを結合する場合の考えてほしい、結合順序と結合条件について解説します。

    テーブルの結合順序

    先ほど、SQLにおける5種類のテーブル結合について解説しましたが、この5種類の中でよく使われるのは、INNER JOINとLEFT OUTER JOINの2つです。そして、この2つのコマンドでは、結合するテーブルの順序にも注意が必要です。なお、SQLのテーブル結合とは、JOINの左右のテーブルを、ONの条件で結合することです。そのため、JOINで3つ以上のテーブルを結合する場合は、新しく作られる左側のテーブルをJOINの右側のテーブルを、ONの条件で結合することを意味します。

    例えば5つのテーブルを結合するSQLの書き方は、次のとおりです。

    複数のテーブルを結合するSQLの書き方
    SELECT *
    FROM 表1 LEFT OUTER JOIN 表2 ON 条件1 <– 表1と表2を結合
    LEFT OUTER JOIN 表3 ON 条件2 <– 表1と表2を結合したテーブルと、表3を結合
    LEFT OUTER JOIN 表4 ON 条件3 <– 表1と表2と表3を結合したテーブルと、表4を結合
    LEFT OUTER JOIN 表5 ON 条件4 <– 表1と表2と表3と表4を結合したテーブルと、表5結合
    ;

    なお、INNER JOINでは、表を結合すると同時に抽出も同時に実行されます。そのため、結合する順序によって出力されるデータが違うケースがあるので、どの順序で結合するかが重要です。表に書き出す順序ではなく、表を作る際にケアしたいデータを明確にしてSQLを作成しましょう。

    テーブルの結合条件

    先ほど説明したように、SQLでテーブルを結合するコマンド、INNER JOINとOUTER JOINでは、ON句に結合条件を記述します。そして、この条件には、複数の条件も指定可能です。

    INNER JOINで複数の条件を指定
    SELECT * FROM 表1 INNER JOIN 表2 ON ( 条件1 AND 条件2 );

    OUTER JOINで複数の条件を指定
    SELECT * FROM 表1 LEFT OUTER JOIN 表2 ON ( 条件1 AND 条件2 );

    通常、ONに記述する条件には、2つのテーブルで一致するデータを指定しますが、それ以外に抽出条件も記述できます。特に、INNER JOINのON句に抽出条件を記述しておくことで、WHERE句に抽出条件を指定した場合と同じ結果が補償されています。

    なお、SQLにおけるSELECT文の処理では、FROM句のテーブル結合が終わってから、WHEREによる抽出処理を実施します。そのため、FROM句のONでデータを抽出できていれば、わざわざWHEREを指定する必要はありません。

    SQLのテーブル結合はプログラムにも有利

    Webシステムなど、プログラムからデータベースを使う場合、SQLでテーブルを作らなくても、プログラム側でいくらでも必要なデータが作れます。しかし、わざわざ複雑なプログラムを作らなくても、SQLで処理しやすいリストを作れれば、プログラム開発も楽になります。ぜひ、今回紹介した内容を参考にSQLのテーブル結合を学び、システム開発のスキルアップを目指しましょう。


    ポテパンが提供するサービスについて

    本メディア「ポテパンスタイル」を運営する株式会社ポテパンは、エンジニアキャリア領域で複数サービスを提供しています。

    ポテパンフリーランス

    ポテパンフリーランス

    フリーランスエンジニアの方に高単価案件をご紹介しております。弊社ではフリーランス案件を常時300件ほど保有しており、その中からあなたに適した案件をご案内いたします。また、これから独立してフリーランスになる方の無料個別相談も承っております。フリーランスになった後の案件獲得方法やお金面(税金や保険など)についてお答えいたします!フリーエンジニアになりたい方向けのコンテンツも盛りだくさんです。

    ポテパンキャリア

    ポテパンキャリア

    エンジニア職専門の転職エージェントです。ポテパンキャリアでは、技術のわかるエージェントがあなたの転職をサポートします。エージェント自身がエンジニアなので、あなたと同じ目線で仕事内容や今後のキャリアについて一緒に考えることができます。年収800万円以上のハイスペック転職をご希望の方は「ポテパンプロフェッショナル」もご用意しておりますのでご利用下さいませ。

    ポテパンキャンプ

    ポテパンキャンプ

    ポテパンキャンプでは、RubyにてゼロからオリジナルのECサイトを作り上げてる3ヶ月間の実践型カリキュラムを提供しております。すでに本スクールの卒業生は、エンジニア職として様々な企業様に就職しております。なお、本スクールは受講料25万円と他社スクールに比べ格安となっており、またポテパンからご紹介させていただいた企業へ就職が決まった場合は、全額キャッシュバックいたします。



    株式会社ポテパンは、企業とエンジニアの最適なマッチングを追求しています。気になるサービスがあれば、ぜひ覗いてみてください!

    ポテクラバナー ポテプロバナー

    この記事をシェア

    • Facebookシェア
    • Twitterシェア
    • Hatenaシェア
    • Lineシェア

    関連ワード

    pickup









    ABOUT US

    ポテパンはエンジニアと企業の最適なマッチングを追求する企業です。

    READ MORE

    ポテパンおすすめ案件