データベースからデータを取得する際、2つ以上のテーブルからそれぞれデータを取得したいといったケースは頻繁に起こり得ます。
テーブル結合には、内部結合(INNER JOIN)と外部結合(OUTER JOIN)、更に交差結合(CROSS JOIN)と呼ばれる方法が存在します。
本記事では、SQLの内部結合(INNER JOIN)に特化した形で、基本的な構文やサンプルを交えながら使い方についてご紹介していきたいと思います。
目次
SQLの内部結合 INNER JOINの基本構文
まずはSQLの内部結合で利用する、INNER JOINの基本構文を確認していきましょう。
INNER JOINの基本
INNER JOINを用いたSQLの記述方法は下記の通りです。
SELECT (テーブル名.)カラム名(, ....) FROM テーブル1 INNER JOIN テーブル2 ON テーブル2.カラム名 = テーブル1.カラム名
ON句にテーブルの結合条件を指定し、一致するデータを取得します。
INNER JOINの省略形
INNER JOINは省略形を用いて、「JOIN」と記述するだけでも内部結合として処理が実行されます。
ただし、慣例的にINNNER JOINと省略せずに記述する方法が推奨されています。
SELECT (テーブル名.)カラム名(, ....) FROM テーブル1 JOIN テーブル2 ON テーブル2.カラム名 = テーブル1.カラム名
SELECTのテーブル名は、結合した双方のテーブルに同名のカラムが存在する場合に必要です。
もちろん「*」で両方のテーブルの全てのカラムを取得することも可能です。
SQLの内部結合を利用してデータを取得してみよう
では実際にSQLの内部結合でデータを取得するサンプルで、具体的な動きを確認してみましょう。
今回使用するテーブルは下記の2テーブルとなります。
user
+------+--------------+------+ | id | name | age | +------+--------------+------+ | 1 | 山田花子 | 22 | | 2 | 山田太郎 | 33 | | 3 | 佐藤一郎 | 44 | +------+--------------+------+
purchase
+------+---------------------+---------+------------+ | id | pur_date | user_id | product_id | +------+---------------------+---------+------------+ | 1 | 2020-01-01 12:00:02 | 2 | 3 | | 2 | 2020-01-03 14:00:00 | 1 | 3 | | 3 | 2020-01-03 16:00:00 | 2 | 1 | +------+---------------------+---------+------------+
サンプルで動作確認してみよう
では実際に「user」テーブルと「purchase」テーブルを結合して、内部結合の動きを見ていきましょう。
今回はユーザーのidを使用してテーブルを結合するサンプルです。
SELECT * FROM user INNER JOIN purchase ON purchase.user_id = user.id;
実行した結果が下記の通りです。
+------+--------------+------+------+---------------------+---------+------------+ | id | name | age | id | pur_date | user_id | product_id | +------+--------------+------+------+---------------------+---------+------------+ | 2 | 山田太郎 | 33 | 1 | 2020-01-01 12:00:02 | 2 | 3 | | 1 | 山田花子 | 22 | 2 | 2020-01-03 14:00:00 | 1 | 3 | | 2 | 山田太郎 | 33 | 3 | 2020-01-03 16:00:00 | 2 | 1 | +------+--------------+------+------+---------------------+---------+------------+
「user」テーブルのidと「purchase」テーブルのuser_idが一致するデータのみが抽出されており、「purchase」テーブルに存在しないuser_idが3のデータは対象外となっていることがご確認頂けます。
SQLで複数のテーブルを内部結合するには?
上述したSQLでユーザーの購入履歴は分かりましたが、product_idが何か分からないため、どんな商品を購入したのかが分かりません。
2つ以上のテーブルを結合する方法についても確認しておきましょう。
商品管理用のテーブルproductを今回サンプルとして追加します。
product
+------+-----------------------+--------+ | id | name | price | +------+-----------------------+--------+ | 1 | ノートパソコン | 100000 | | 2 | スマートフォン | 50000 | | 3 | タブレット | 70000 | +------+-----------------------+--------+
2つ以上のテーブルを結合する基本構文
まずは2つ以上のテーブルを結合する基本構文について確認しておきましょう。
書き方は簡単で、1つだけのテーブル結合にINNER JOINを繋げていくだけです。
SELECT (テーブル名.)カラム名(, ....) FROM テーブル1 INNER JOIN テーブル2 ON テーブル2.カラム名 = テーブル1.カラム名 INNER JOIN テーブル3 ON テーブル3.カラム名 = テーブル1(2).カラム名
サンプルコードで確認しよう
今回は上記サンプルに追加で「purchase」テーブルのproduct_idと「product」テーブルのidを繋げて商品名を取得したいと思います。
また今回は取得するデータをいくつかのカラムに絞って抽出してみましょう。
SELECT user.id, user.name, purchase.pur_date, product.name, product.price FROM user INNER JOIN purchase ON purchase.user_id = user.id INNER JOIN product ON product.id = purchase.product_id;
実行した結果が下記の通りです。
+------+--------------+---------------------+-----------------------+--------+ | id | name | pur_date | name | price | +------+--------------+---------------------+-----------------------+--------+ | 2 | 山田太郎 | 2020-01-03 16:00:00 | ノートパソコン | 100000 | | 2 | 山田太郎 | 2020-01-01 12:00:02 | タブレット | 70000 | | 1 | 山田花子 | 2020-01-03 14:00:00 | タブレット | 70000 | +------+--------------+---------------------+-----------------------+--------+
さいごに:SQLの内部結合は実務では必須の知識
本記事では、SQLの内部結合(INNER JOIN)の基本的な使い方をご紹介してきました。
データベースを利用するシステム開発において、内部結合の使い方は必須となる知識です。
SQLのテーブル結合は、まだまだ様々な記述方法やルールがありますので、まずは内部結合の基本をしっかりと理解した上で、1つずつ使いこなせるように挑戦していきましょう。
ON句に指定するテーブル名の順番は特に指定はありませんが、INNER JOINに指定したテーブル名を先に記述する方法が慣例的に多いようです。