概要: このチュートリアルでは、SQL INNER JOIN句を使用して、2つ以上のテーブルからデータをクエリする方法を学びます。
SQL INNER JOIN句の概要
これまで、SELECTステートメントを使用して、単一のテーブルからデータをクエリする方法を学びました。ただし、SELECT
ステートメントは単一のテーブルからのデータのクエリに限定されません。 SELECT
ステートメントは、複数のテーブルを一緒にリンクできます。
テーブルをリンクするプロセスは、結合と呼ばれます。SQLは、内部結合、左結合、右結合、完全外部結合など、多くの種類の結合を提供します。このチュートリアルでは、内部結合に焦点を当てます。
テーブルAとテーブルBの2つのテーブルがあるとします。
テーブルAには4行(1,2,3,4)があり、テーブルBには4行(3,4,5,6)があります。
テーブルAが内部結合を使用してテーブルBと結合すると、テーブルAとBの共通部分である結果セット(3,4)が得られます。
次の図を参照してください。

テーブルAの各行について、内部結合句はテーブルBの一致する行を検索します。行が一致した場合、最終結果セットに含まれます。
AテーブルとBテーブルの列がそれぞれa
とb
であるとします。次のステートメントは、内部結合句を示しています。
SELECT a
FROM A
INNER JOIN B ON b = a;
Code language: SQL (Structured Query Language) (sql)
INNER JOIN句は、FROM句の後に現れます。テーブルAとBの間で一致させる条件は、ONキーワードの後に指定します。この条件は、結合条件と呼ばれます。つまり、B.n = A.n
です。
INNER JOIN句は、外部キー関係など、関係がある限り、3つ以上のテーブルを結合できます。
たとえば、次のステートメントは、テーブルA、B、およびCの3つのテーブルを結合する方法を示しています。
SELECT
A.n
FROM A
INNER JOIN B ON B.n = A.n
INNER JOIN C ON C.n = A.n;
Code language: SQL (Structured Query Language) (sql)
SQL INNER JOINの例
INNER JOIN
句を使用するいくつかの実用的な例を見てみましょう。
1) SQL INNER JOINを使用して2つのテーブルを結合する
サンプルデータベースのemployees
テーブルとdepartments
テーブルを使用して、INNER JOIN
句の動作を説明します。

各従業員は1つの部門にのみ所属し、各部門には複数の従業員がいる可能性があります。departments
とemployees
の関係は1対多です。
employees
テーブルのdepartment_id
列は、employees
をdepartments
テーブルにリンクする外部キー列です。
部門ID1、2、および3の情報を取得するには、次のステートメントを使用します。
SELECT
department_id,
department_name
FROM
departments
WHERE
department_id IN (1, 2, 3);
Code language: SQL (Structured Query Language) (sql)

WHERE句で、部門ID1、2、および3の行を取得するために、IN演算子を使用したことに注意してください。
部門ID1、2、および3で働く従業員の情報を取得するには、次のクエリを使用します。
SELECT
first_name,
last_name,
department_id
FROM
employees
WHERE
department_id IN (1, 2, 3)
ORDER BY
department_id;
Code language: SQL (Structured Query Language) (sql)

これらの2つのテーブルのデータを結合するには、次のクエリのように内部結合句を使用します。
SELECT
first_name,
last_name,
employees.department_id,
departments.department_id,
department_name
FROM
employees
INNER JOIN
departments ON departments.department_id = employees.department_id
WHERE
employees.department_id IN (1 , 2, 3);
Code language: SQL (Structured Query Language) (sql)

employees
テーブルの各行について、ステートメントはdepartment_id
列の値がdepartments
テーブルのdepartment_id
列の値と等しいかどうかを確認します。
条件employees.department_id = departments.department_id
が満たされている場合、employees
テーブルとdepartments
テーブルの両方の行のデータを含む結合された行が、結果セットに含まれます。
employees
テーブルとdepartments
テーブルの両方に同じ列名department_id
があるため、table_name.column_name
の構文を使用してdepartment_id
列を修飾する必要があったことに注意してください。
SQL INNER JOIN 3つのテーブルの例
各従業員は1つのジョブを保持し、1つのジョブは多くの従業員によって保持される可能性があります。jobs
テーブルとemployees
テーブルの関係は1対多です。
次のデータベース図は、employees
、departments
、およびjobs
テーブル間の関係を示しています。

次のクエリでは、内部結合句を使用して、従業員、部門、およびジョブの3つのテーブルを結合して、部門ID1、2、および3で働く従業員の姓、名、役職、および部門名を取得します。
SELECT
first_name,
last_name,
job_title,
department_name
FROM
employees e
INNER JOIN departments d ON d.department_id = e.department_id
INNER JOIN jobs j ON j.job_id = e.job_id
WHERE
e.department_id IN (1, 2, 3);
Code language: SQL (Structured Query Language) (sql)

これで、SQL INNER JOIN句の動作を理解し、複数のテーブルからデータをクエリする方法を理解できたはずです。