SQLでデータを取得する際、複数のテーブルからデータを取得したいケースは頻繁に訪れます。
本記事では、複数テーブルからデータを取得する際に利用するJOIN句を使ったテーブル結合について解説していきます。
目次
SQLのテーブル結合の種類を知ろう
SQLのテーブル結合には大きく分け2種類の方法が存在します。
他にもクロス結合や自己結合といったテーブル結合が存在しますが、あまり利用されることも多くないため、今回は一般的な下記の2種類をご紹介していきます。
- 内部結合(INNER JOIN)
- 外部結合(OUTER JOIN)
サンプルデータ
今回サンプルとして利用するデータは下記の2つのテーブルです。
officeテーブル
+------+--------------------+-----------+ | id | office_name | region_id | +------+--------------------+-----------+ | 1 | 新宿支店 | 3 | | 2 | 渋谷支店 | 3 | | 3 | 函館支店 | 1 | | 4 | 梅田支店 | 5 | | 5 | 那覇支店 | 9 | | 6 | ソウル支店 | 99 | | 7 | バンコク支店 | 99 | +------+--------------------+-----------+
regionテーブル
+------+-------------+ | id | region_name | +------+-------------+ | 1 | 北海道 | | 2 | 東北 | | 3 | 関東 | | 4 | 中部 | | 5 | 近畿 | | 6 | 中国 | | 7 | 四国 | | 8 | 九州 | | 9 | 沖縄 | +------+-------------+
SQLのテーブル結合1: 内部結合(INNER JOIN)
最初に内部結合(INNER JOIN)から説明していきます。
内部結合では、両テーブルで指定したカラムの値が一致するデータのみを抽出する方法です。
基本構文
内部結合(INNER JOIN)の基本構文は下記となります。
SELECT カラム名(, カラム名, ...) FROM テーブル1 INNER JOIN テーブル2 ON テーブル2.カラム名 = テーブル1.カラム名
サンプル1
では実際にサンプルデータから内部結合でデータを取得してみたいと思います。
今回はofficeテーブルのregion_idとregionテーブルのidが一致するデータを抽出するSQLを作成してみましょう。
SELECT * FROM office INNER JOIN region ON region.id = office.region_id;
実行した結果が下記の通りです。
+------+--------------+-----------+------+-------------+ | id | office_name | region_id | id | region_name | +------+--------------+-----------+------+-------------+ | 3 | 函館支店 | 1 | 1 | 北海道 | | 1 | 新宿支店 | 3 | 3 | 関東 | | 2 | 渋谷支店 | 3 | 3 | 関東 | | 4 | 梅田支店 | 5 | 5 | 近畿 | | 5 | 那覇支店 | 9 | 9 | 沖縄 | +------+--------------+-----------+------+-------------+
このように双方のテーブルで一致するデータのみが抽出されています。
サンプル2
もちろんWHERE句で条件指定を加えることも可能です。
例えば関東地方のデータのみを抽出したい場合には下記のように記述することが出来ます。
SELECT * FROM office INNER JOIN region ON region.id = office.region_id WHERE region.id = 3;
実行した結果が下記の通りです。
+------+--------------+-----------+------+-------------+ | id | office_name | region_id | id | region_name | +------+--------------+-----------+------+-------------+ | 1 | 新宿支店 | 3 | 3 | 関東 | | 2 | 渋谷支店 | 3 | 3 | 関東 | +------+--------------+-----------+------+-------------+
SQLのテーブル結合2: 外部結合(OUTER JOIN)
続いて外部結合(OUTER JOIN)は、軸となるテーブルのデータ全てに加えて、条件に一致したもう片方のデータを取得します。
外部結合にはLEFT OUTER JOINとRIGHT OUTER JOINが存在します。
一般的にはLEFT OUTER JOINが利用されるため、特に理由がない限りはLEFT OUTER JOINを使用すると覚えておきましょう。
LEFT OUTER JOIN
まずはLEFT OUTER JOINの基本構文です。
FROM句の後ろに記述する「テーブル1」が軸のテーブルとなります。
SELECT カラム名(, カラム名, ...) FROM テーブル1 LEFT (OUTER) JOIN テーブル2 ON テーブル2.カラム名 = テーブル1.カラム名;
サンプル
では実際にサンプルで確認してみましょう。
SELECT * FROM office LEFT JOIN region ON region.id = office.region_id;
実行した結果が下記の通りです。
+------+--------------------+-----------+------+-------------+ | id | office_name | region_id | id | region_name | +------+--------------------+-----------+------+-------------+ | 3 | 函館支店 | 1 | 1 | 北海道 | | 1 | 新宿支店 | 3 | 3 | 関東 | | 2 | 渋谷支店 | 3 | 3 | 関東 | | 4 | 梅田支店 | 5 | 5 | 近畿 | | 5 | 那覇支店 | 9 | 9 | 沖縄 | | 6 | ソウル支店 | 99 | NULL | NULL | | 7 | バンコク支店 | 99 | NULL | NULL | +------+--------------------+-----------+------+-------------+
このように、軸となるテーブルのデータが全て取得され、結合対象のテーブルに該当データが存在しない場合はNULLが表示されます。
RIGHT OUTER JOIN
では今度はRIGHT OUTER JOINの基本構文を確認してみましょう。
RIGHT OUTER JOINでは、テーブル2が軸となるテーブルです。
SELECT カラム名(, カラム名, ...) FROM テーブル1 RIGHT (OUTER) JOIN テーブル2 ON テーブル2.カラム名 = テーブル1.カラム名;
サンプル
LEFT OUTER JOINのサンプルをRIGHT OUTER JOINに変えたシンプルなものです。
SELECT * FROM office RIGHT JOIN region ON region.id = office.region_id;
結果は下記の通りです。
+------+--------------+-----------+------+-------------+ | id | office_name | region_id | id | region_name | +------+--------------+-----------+------+-------------+ | 1 | 新宿支店 | 3 | 3 | 関東 | | 2 | 渋谷支店 | 3 | 3 | 関東 | | 3 | 函館支店 | 1 | 1 | 北海道 | | 4 | 梅田支店 | 5 | 5 | 近畿 | | 5 | 那覇支店 | 9 | 9 | 沖縄 | | NULL | NULL | NULL | 2 | 東北 | | NULL | NULL | NULL | 4 | 中部 | | NULL | NULL | NULL | 6 | 中国 | | NULL | NULL | NULL | 7 | 四国 | | NULL | NULL | NULL | 8 | 九州 | +------+--------------+-----------+------+-------------+
軸となるテーブルが変更されたことにより、取得結果が大きく異なることをご確認頂けます。
さいごに:SQLのテーブル結合はシステム開発において必須
本記事では、SQLのテーブル結合の中でも、特に利用機会の多い「内部結合」と「外部結合」についてご紹介してきました。
SQL初心者の方には、使いどころの判断が難しいかも知れませんが、様々なデータ取得を繰り返すことで感覚的に理解出来るようになっていきます。
ご自身が利用したいデータを取得するには、どちらのテーブル結合を使用するべきか考えながら、様々なデータ取得処理に挑戦してみてください。
外部結合ではOUTERの部分を記述せず、LEFT JOIN・RIGHT JOINと記述する方法でも問題ありません。