概要: このチュートリアルでは、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句の動作を理解し、複数のテーブルからデータをクエリする方法を理解できたはずです。