Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

INNER JOIN

2つのテーブルを結合し、両方に一致する行のみを取得するSQL文です。最もよく使われる結合方法です。

構文
-- INNER JOIN で2つのテーブルを結合します。
SELECT 列名 FROM テーブル1
INNER JOIN テーブル2 ON テーブル1.結合列 = テーブル2.結合列;

-- INNER は省略可能です(JOIN のみでも同じ動作です)。
SELECT 列名 FROM テーブル1
JOIN テーブル2 ON テーブル1.結合列 = テーブル2.結合列;

-- 旧来の WHERE 句を使った結合(同じ意味)。
SELECT 列名 FROM テーブル1, テーブル2
WHERE テーブル1.結合列 = テーブル2.結合列;
構文一覧
構文概要
INNER JOIN テーブル2 ON 条件両テーブルで ON の条件を満たす行のみを結合して取得します。どちらか一方に存在しない行は結果に含まれません。
JOIN テーブル2 ON 条件INNER JOIN の省略形です。動作は同じです。
テーブル名 AS エイリアステーブルに短い別名を付けることができます。複数テーブルを扱う場合に記述を簡潔にできます。
サンプルコード
-- 社員テーブルと部署テーブルを結合して、部署名とともに社員一覧を取得します。
SELECT e.name, d.department_name, e.salary
FROM employees AS e
INNER JOIN departments AS d ON e.department_id = d.id;

-- 注文テーブルと顧客テーブルを結合して、注文履歴を取得します。
SELECT c.name AS 顧客名, o.order_date, o.total_amount
FROM orders AS o
INNER JOIN customers AS c ON o.customer_id = c.id
ORDER BY o.order_date DESC;

-- 3つのテーブルを結合します(社員・部署・役職)。
SELECT e.name, d.department_name, r.role_name
FROM employees AS e
INNER JOIN departments AS d ON e.department_id = d.id
INNER JOIN roles AS r ON e.role_id = r.id;

-- WHERE句の絞り込みと組み合わせます。
SELECT e.name, d.department_name
FROM employees AS e
INNER JOIN departments AS d ON e.department_id = d.id
WHERE d.department_name = '開発部';
実行結果
-- SELECT e.name, d.department_name, e.salary FROM employees AS e
-- INNER JOIN departments AS d ON e.department_id = d.id; の結果例
-- +----------+------------------+--------+
-- | name     | department_name  | salary |
-- +----------+------------------+--------+
-- | 田中太郎 | 開発部           | 300000 |
-- | 鈴木花子 | 営業部           | 280000 |
-- | 山田次郎 | 開発部           | 320000 |
-- +----------+------------------+--------+
-- ※ department_id が NULL の社員は結果に含まれません。
データベース別の書き方

『INNER JOIN ... ON』の構文は主要なデータベースで共通して使用できます。

-- MySQL・PostgreSQL・SQL Server・Oracle・SQLite 共通
SELECT e.name, d.department_name, e.salary
FROM employees AS e
INNER JOIN departments AS d ON e.department_id = d.id;

Oracle では従来『FROM テーブル1, テーブル2 WHERE 条件』の旧構文が多く使われていましたが、Oracle 9i 以降は『INNER JOIN ... ON』が使用できます。現在は『JOIN』構文に統一するのが推奨されています。

概要

『INNER JOIN』は関係データベースの核心的な機能で、正規化されたテーブルのデータを組み合わせて取得するために使用します。『ON』句に結合条件を記述し、両テーブルで条件を満たす行だけを返します。

旧来の『FROM テーブル1, テーブル2 WHERE テーブル1.id = テーブル2.id』という書き方は『INNER JOIN ... ON』と同じ意味ですが、現在は『JOIN』を明示的に書く方が意図が明確で読みやすいとされています。

片方のテーブルに一致する行がない場合でも結果を含めたい場合は『LEFT JOIN / RIGHT JOIN』を使用してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。