JOINを使うと、複数のテーブルからデータを結合し、一緒に解析することができます。今回は、JOINの基本とその種類について見ていきましょう。
前提情報
前提のテーブルとデータは下記の通りになります。
SQLfiddleというサイトで確認できます。
http://sqlfiddle.com/
左側でテーブルを作成してデータを投入、右側でデータを抽出するためのSELECT文を入れることでデータを出すことができます。下記の画像はOrdersテーブルの全クエリのデータを抽出した結果の画像です。
CREATE TABLE Users ( user_id INT, user_name VARCHAR(255) ); CREATE TABLE Orders ( order_id INT, user_id INT, product_id INT ); INSERT INTO Users (user_id, user_name) VALUES (1, 'Tanaka'), (2, 'Suzuki'), (3, 'Sato'), (4, 'Kato'); INSERT INTO Orders (order_id, user_id, product_id) VALUES (1, 1, 1), (2, 2, 1), (3, 3, 2);
JOINの基本
JOINは基本的に2つのテーブルを「つなげる」操作です。データが異なるテーブルに分散している場合でも、JOINを使用すれば1つのテーブルとして扱うことができます。
例えば、次のクエリは「Users」テーブルと「Orders」テーブルを結合し、ユーザー名とその注文数を一緒に表示します。
SELECT Users.user_name, COUNT(Orders.order_id) as order_count
FROM Users
JOIN Orders ON Users.user_id = Orders.user_id
GROUP BY Users.user_name;
このクエリは、JOIN句を使用してUsersとOrdersテーブルを結合しています。結合の条件はUsers.user_id = Orders.user_id
と指定され、これにより両テーブルのuser_idが一致する行が結合されます。
JOINの種類
JOINにはいくつかの種類があり、それぞれ異なる結果を生み出します。
- INNER JOIN: 両方のテーブルに存在する行のみを結合します。
- LEFT (OUTER) JOIN: 左のテーブルの全ての行と、右のテーブルのマッチする行を結合します。マッチしない場合はNULLが返されます。
- RIGHT (OUTER) JOIN: 右のテーブルの全ての行と、左のテーブルのマッチする行を結合します。マッチしない場合はNULLが返されます。
- FULL (OUTER) JOIN: 両方のテーブルの全ての行を結合します。マッチしない場合はNULLが返されます。
INNER JOIN
このJOINは、両方のテーブルに存在する行のみを結合します。したがって、INNER JOINを使用してUsersとOrdersを結合すると、次のような結果になります。
SELECT Users.user_name, Orders.product_id
FROM Users
INNER JOIN Orders ON Users.user_id = Orders.user_id;
user_name | product_id |
---|---|
Tanaka | 1 |
Suzuki | 1 |
Sato | 2 |
“Kato”はOrdersテーブルに該当するエントリがないため、結果に含まれません。
LEFT (OUTER) JOIN
LEFT JOINは、左のテーブル(最初に記述したテーブル)の全ての行と、右のテーブルのマッチする行を結合します。マッチしない場合はNULLが返されます。したがって、次のような結果になります。
SELECT Users.user_name, Orders.product_id
FROM Users
LEFT JOIN Orders ON Users.user_id = Orders.user_id;
user_name | product_id |
---|---|
Tanaka | 1 |
Suzuki | 1 |
Sato | 2 |
Kato | NULL |
“Kato”のproduct_idはマッチするOrdersテーブルの行がないため、NULLが表示されます。
RIGHT (OUTER) JOIN
RIGHT JOINは、右のテーブル(二番目に記述したテーブル)の全ての行と、左のテーブルのマッチする行を結合します。マッチしない場合はNULLが返されます。MySQLではRIGHT JOINが利用可能ですが、一部のデータベースシステムでは利用できないこともあります。
SELECT Users.user_name, Orders.product_id
FROM Users
RIGHT JOIN Orders ON Users.user_id = Orders.user_id;
user_name | product_id |
---|---|
Tanaka | 1 |
Suzuki | 1 |
Sato | 2 |
RIGHT JOINとUsersテーブルとOrdersテーブルの組み合わせでは、INNER JOINと同じ結果になります。これは、すべてのOrders行がUsersテーブルの行と一致するからです。ただし、あるOrders行が対応するUsers行を持たない場合、その行は結果にNULLとして含まれます。
FULL (OUTER) JOIN
FULL JOINは、両方のテーブルの全ての行を結合します。マッチしない場合はNULLが返されます。MySQLではFULL OUTER JOINが直接利用できませんが、LEFT JOINとRIGHT JOINをUNIONすることで同様の結果を得ることができます。
ここでは、LEFT JOINとRIGHT JOINを組み合わせたクエリを示します。
SELECT Users.user_name, Orders.product_id
FROM Users
LEFT JOIN Orders ON Users.user_id = Orders.user_id
UNION
SELECT Users.user_name, Orders.product_id
FROM Users
RIGHT JOIN Orders ON Users.user_id = Orders.user_id;
user_name | product_id |
---|---|
Tanaka | 1 |
Suzuki | 1 |
Sato | 2 |
Kato | NULL |
FULL JOINは、左右のテーブルの全ての行を返すため、マッチしない行にはNULLが表示されます。ここでは、”Kato”のproduct_idがNULLになっています。
これらのJOINの違いを理解することは、どのテーブルのデータを結果に含めたいかによって、どの種類のJOINを使用すべきかを決定する上で非常に重要です。また、これらのJOINを適切に使用することで、データの洞察をより深く、より広範囲に得ることが可能となります。
最後に、JOINを利用する際には、必ずON句で結合する基準となるカラムを指定することを忘れないでください。指定しないと、全ての組み合わせが生成されてしまい、予期しない結果を引き起こす可能性がありますのでご注意ください。
データ分析でお困りの企業様の課題解決をサポートします。お気軽に下記よりお問い合わせください。