バナー画像

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は、結合するテーブルのデータのうち、条件に指定したカラムの値が一致するデータのみを結合します。

例
SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id;

この例では、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が入ります。

例
SELECT * FROM table1 LEFT OUTER JOIN table2 ON table1.id = table2.id;

この例では、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が入ります。

例
SELECT * FROM table1 RIGHT OUTER JOIN table2 ON table1.id = table2.id;

この例では、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を入れる方法です。

例
SELECT * FROM table1 FULL OUTER JOIN table2 ON table1.id = table2.id;

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

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つのテーブルの行の全ての組み合わせを出力する方法です。

例
SELECT * FROM table1 CROSS JOIN table2 ;

この例では、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のテーブル結合を学び、システム開発のスキルアップを目指しましょう。

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

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

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

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

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

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

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

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

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

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

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