PostgreSQL

SQL JOINの使い方|テーブル結合を完全に理解する

SQL JOIN データベース

SQL JOINの使い方
テーブル結合を完全に理解する

JOINは複数のテーブルを結合してデータを取得するSQLの重要な機能です。
この記事では、INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOINの違いと使い分けを図解で解説します。

こんな人向けの記事です

  • JOINの種類と違いを理解したい
  • 複数テーブルからデータを取得したい
  • LEFT JOINとINNER JOINの使い分けを知りたい

サンプルテーブル

以下の2つのテーブルを使って各JOINを説明します。

users テーブル
idname
1田中
2鈴木
3佐藤
orders テーブル
iduser_idproduct
11ノートPC
21マウス
32キーボード
499モニター

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;
nameproduct
田中ノート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;
nameproduct
田中ノート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;
nameproduct
田中ノートPC
田中マウス
鈴木キーボード
NULLモニター

Step 5FULL JOIN(完全外部結合)

両方のテーブルの全データを取得します。一致しないデータはNULLになります。

SQL
SELECT users.name, orders.product
FROM users
FULL OUTER JOIN orders ON users.id = orders.user_id;
nameproduct
田中ノート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 JOINLEFT JOIN が9割
  • JOINは複数チェーンして3テーブル以上も結合可能