SQL JOINの使い方
テーブル結合を完全に理解する
JOINは複数のテーブルを結合してデータを取得するSQLの重要な機能です。
この記事では、INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOINの違いと使い分けを図解で解説します。
こんな人向けの記事です
- JOINの種類と違いを理解したい
- 複数テーブルからデータを取得したい
- LEFT JOINとINNER JOINの使い分けを知りたい
サンプルテーブル
以下の2つのテーブルを使って各JOINを説明します。
| users テーブル | |
|---|---|
| id | name |
| 1 | 田中 |
| 2 | 鈴木 |
| 3 | 佐藤 |
| orders テーブル | ||
|---|---|---|
| id | user_id | product |
| 1 | 1 | ノートPC |
| 2 | 1 | マウス |
| 3 | 2 | キーボード |
| 4 | 99 | モニター |
Step 1JOINとは
JOINは、複数のテーブルを共通のカラム(キー)で結合し、1つの結果セットとして取得する操作です。
Step 2INNER JOIN(内部結合)
両方のテーブルに一致するデータのみを取得します。最もよく使うJOINです。
SQL
SELECT users.name, orders.product
FROM users
INNER JOIN orders ON users.id = orders.user_id;
| name | product |
|---|---|
| 田中 | ノートPC |
| 田中 | マウス |
| 鈴木 | キーボード |
結果の解説
佐藤は注文がない(ordersにuser_id=3がない)ので含まれません。user_id=99の注文はusersに該当ユーザーがいないので含まれません。
Step 3LEFT JOIN(左外部結合)
左テーブル(FROM)の全データを取得し、右テーブルに一致するデータがなければNULLになります。
SQL
SELECT users.name, orders.product
FROM users
LEFT JOIN orders ON users.id = orders.user_id;
| name | product |
|---|---|
| 田中 | ノートPC |
| 田中 | マウス |
| 鈴木 | キーボード |
| 佐藤 | NULL |
LEFT JOINの使いどころ
「注文の有無にかかわらず、全ユーザーを一覧したい」場合に使います。最もよく使う外部結合です。
Step 4RIGHT JOIN(右外部結合)
右テーブル(JOIN先)の全データを取得します。LEFT JOINの逆です。
SQL
SELECT users.name, orders.product
FROM users
RIGHT JOIN orders ON users.id = orders.user_id;
| name | product |
|---|---|
| 田中 | ノートPC |
| 田中 | マウス |
| 鈴木 | キーボード |
| NULL | モニター |
Step 5FULL JOIN(完全外部結合)
両方のテーブルの全データを取得します。一致しないデータはNULLになります。
SQL
SELECT users.name, orders.product
FROM users
FULL OUTER JOIN orders ON users.id = orders.user_id;
| name | product |
|---|---|
| 田中 | ノートPC |
| 田中 | マウス |
| 鈴木 | キーボード |
| 佐藤 | NULL |
| NULL | モニター |
MySQLはFULL JOINをサポートしない
MySQLではFULL OUTER JOINは使えません。LEFT JOINとRIGHT JOINの結果をUNIONして代用します。
PostgreSQLやSQL Serverでは使用可能です。
Step 6複数テーブルのJOIN
SQL
SELECT
users.name,
orders.product,
categories.category_name
FROM users
INNER JOIN orders ON users.id = orders.user_id
INNER JOIN categories ON orders.category_id = categories.id
WHERE users.id = 1;
JOIN早見表
| 種類 | 取得するデータ | よくある用途 |
|---|---|---|
INNER JOIN | 両方に一致するデータのみ | 関連データの取得 |
LEFT JOIN | 左テーブル全部 + 右の一致データ | 全ユーザー + 注文(あれば) |
RIGHT JOIN | 右テーブル全部 + 左の一致データ | あまり使わない(LEFT JOINで代用) |
FULL JOIN | 両方のテーブル全部 | データの不整合チェック |
まとめ
INNER JOIN→ 両方のテーブルに存在するデータのみ取得LEFT JOIN→ 左テーブルの全データ + 右テーブルの一致データON句で結合条件(キー)を指定- 実務では
INNER JOINとLEFT JOINが9割 - JOINは複数チェーンして3テーブル以上も結合可能