SQLを記述する上で必ず理解しておかないといけない構文として、テーブル結合を行うための内部結合・外部結合が挙げられます。
本記事ではMySQL環境でのJOIN句を用いたテーブル結合処理についてサンプルSQLを交えながらご紹介していきたいと思います。
目次
MySQL環境で使えるテーブル結合(JOIN)の基本を理解しよう!
テーブル結合は、SQLで2つ以上のテーブルからデータを取得する際に利用され、リレーショナルデータベースでは必須の知識です。
SQLのテーブル結合では大きく「内部結合」と「外部結合」と呼ばれる2つの結合方法が存在します。
内部結合とは
内部結合では、テーブル同士を結合させる際、結合条件に合致したデータのみが抽出される特徴があります。
MySQLでは「INNER JOIN」または「JOIN」と記述することが内部結合を意味します。
外部結合とは
外部結合では、基準となるテーブルに対象となるデータがあれば結合条件に関係なくデータが抽出され、結合したテーブルの情報は全てNullで表示される特徴があります。
MySQLでは「LEFT JOIN」または「RIGHT JOIN」と記述することが外部結合を意味します。
「LEFT JOIN」と「RIGHT JOIN」の違いは基準とするテーブルを先に記述したテーブル(左側)とするか、後に記述したテーブル(右側)とするかの違いとなります。
MySQLでのJOIN句確認用サンプルテーブル
ここからの説明ではサンプルSQLを交えてご紹介していきますので、使用するデータを記載しておきたいと思います。
ordersテーブル
注文情報を管理するための「orders」テーブルは下記の通りです。
+------+------------+---------+ | id | order_date | user_id | +------+------------+---------+ | 1 | 2020-01-24 | 1 | | 2 | 2020-01-25 | 1 | | 3 | 2020-01-24 | 2 | | 4 | 2020-01-26 | 1 | +------+------------+---------+
orders_detailテーブル
注文情報の詳細を管理するための「orders_detail」テーブルは下記の通りです。
+------+-----------+--------------+---------------+ | id | orders_id | product_name | product_price | +------+-----------+--------------+---------------+ | 1 | 1 | カレー | 800 | | 2 | 1 | サラダ | 500 | | 3 | 2 | ラーメン | 700 | | 4 | 3 | 唐揚げ | 500 | +------+-----------+--------------+---------------+
MySQLで内部結合(INNER JOIN)を使ってみよう
内部結合では2つのテーブルの指定したカラムで比較を行い、同じ値が設定されているデータのみが抽出されます。
内部結合(INNER JOIN)の基本構文
まず基本構文をご紹介します。
SELECT テーブル名.カラム1 [,テーブル名.カラム2, ...] FROM テーブル1 INNER JOIN テーブル2 ON テーブル2.カラム名 = テーブル1.カラム名
テーブル1とテーブル2をINNER JOINで内部結合しているサンプルSQLです。
「ON」の後ろに記述されている内容が結合条件となります。
INNER JOINの使い方をサンプルSQLで確認
実際にサンプルSQLで確認した方が理解しやすいので具体的なデータで確認していきましょう。
利用するデータは上記でご紹介したサンプルテーブルのデータとなります。
今回のサンプルデータでは「orders」テーブルに注文日付とユーザーIDのみが格納されており、具体的な注文内容は「orders_detail」テーブルで管理しています。
実際に注文情報から注文内容の詳細情報を取得する処理をSQLで記述してみましょう。
select * from orders as a1 inner join orders_detail as a2 on a2.orders_id= a1.id;
実際に実行した結果が下記の通りとなります。
+------+------------+---------+------+-----------+--------------+---------------+ | id | order_date | user_id | id | orders_id | product_name | product_price | +------+------------+---------+------+-----------+--------------+---------------+ | 1 | 2020-01-24 | 1 | 1 | 1 | カレー | 800 | | 1 | 2020-01-24 | 1 | 2 | 1 | サラダ | 500 | | 2 | 2020-01-25 | 1 | 3 | 2 | ラーメン | 700 | | 3 | 2020-01-24 | 2 | 4 | 3 | 唐揚げ | 500 | +------+------------+---------+------+-----------+--------------+---------------+
ここで注目して頂きたいのが、「orders」テーブルの「id=4」のデータが抽出されていない点です。
結合条件として指定した「orders_detail」テーブルの「orders_id」に該当となる「4」の値が存在しないため取得出来ていません。
後述する外部結合との大きな違いとなりますのでしっかりと意識しておいてください。
MySQLで外部結合(OUTER JOIN)を使ってみよう
次に外部結合(OUTER JOIN)の使い方についてご紹介していきます。
外部結合には「LEFT OUTER JOIN」と「RIGHT OUTER JOIN」の2つのタイプが存在します。
外部結合の基本構文
まずは「LEFT JOIN」「RIGHT JOIN」の基本構文いついて確認しておきましょう。
SELECT テーブル名.カラム1 [,テーブル名.カラム2, ...] FROM テーブル1 LEFT JOIN テーブル2 ON テーブル2.カラム名 = テーブル1.カラム名
または
SELECT テーブル名.カラム1 [,テーブル名.カラム2, ...] FROM テーブル1 RIGHT JOIN テーブル2 ON テーブル2.カラム名 = テーブル1.カラム名
INNER JOINと構文自体は全く同じで、「INNER」の部分が「LEFT」または「RIGHT」に変更されるだけとなります。
LEFT JOINの使い方をサンプルSQLで確認しよう
INNER JOINで作成したサンプルSQLをLEFT JOINで書き換えてみたいと思います。
select * from orders as a1 left join orders_detail as a2 on a2.orders_id= a1.id;
「INNER JOIN」の部分を「LEFT JOIN」に書き換えただけのサンプルSQLです。
しかし結果は下記のように違いがあることをご確認頂けます。
+------+------------+---------+------+-----------+--------------+---------------+ | id | order_date | user_id | id | orders_id | product_name | product_price | +------+------------+---------+------+-----------+--------------+---------------+ | 1 | 2020-01-24 | 1 | 1 | 1 | カレー | 800 | | 1 | 2020-01-24 | 1 | 2 | 1 | サラダ | 500 | | 2 | 2020-01-25 | 1 | 3 | 2 | ラーメン | 700 | | 3 | 2020-01-24 | 2 | 4 | 3 | 唐揚げ | 500 | | 4 | 2020-01-24 | 1 | NULL | NULL | NULL | NULL | +------+------------+---------+------+-----------+--------------+---------------+
INNER JOINの際には取得出来ていなかった「orders」テーブルの「id=4」のデータが取得されています。
LEFT JOINでは結合条件に関係なく、軸となるテーブルのデータを取得するためこのような結果となります。
RIGHT JOINの使い方をサンプルSQLで確認しよう<
ではRIGHT JOINの場合にはどのようになるのでしょうか?
LEFT JOINの部分をRIGHT JOINに書き換えて実行してみます。
+------+------------+---------+------+-----------+--------------+---------------+ | id | order_date | user_id | id | orders_id | product_name | product_price | +------+------------+---------+------+-----------+--------------+---------------+ | 1 | 2020-01-24 | 1 | 1 | 1 | カレー | 800 | | 1 | 2020-01-24 | 1 | 2 | 1 | サラダ | 500 | | 2 | 2020-01-25 | 1 | 3 | 2 | ラーメン | 700 | | 3 | 2020-01-24 | 2 | 4 | 3 | 唐揚げ | 500 | +------+------------+---------+------+-----------+--------------+---------------+
今回は「orders」テーブルの「id=4」のデータは取得出来ていません。
今回のサンプルの場合、軸となるテーブルが「orders_detail」テーブルに変わったため、結合条件に該当しない「id=4」のデータは取得出来ない結果となります。
さいごに:MySQLでのJOIN内部結合・外部結合の違いをしっかりと把握しよう
本記事では、MySQL環境での内部結合(INNER JOIN)と外部結合(OUTER JOIN)の基本的な使い方をサンプルSQLを交えながらご紹介してきました。
テーブル結合はMySQLなどのリレーショナルデータベースを利用する際に必須の知識であると同時に、しっかりと理解した上で利用しないと思い通りのデータを抽出することは出来ません。
今回ご紹介した内容をしっかりと理解して、用途に合わせて内部結合(INNER JOIN)と外部結合(OUTER JOIN)を使いこなせるように挑戦してみてください。
実際にSQLを記述する際、「LEFT JOIN」「RIGHT JOIN」と記述することが多いため、本記事でも同様の記述法とさせて頂きます。