SQL INNER JOIN

概要: このチュートリアルでは、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)が得られます。

次の図を参照してください。

SQL INNER JOIN

テーブルAの各行について、内部結合句はテーブルBの一致する行を検索します。行が一致した場合、最終結果セットに含まれます。

AテーブルとBテーブルの列がそれぞれabであるとします。次のステートメントは、内部結合句を示しています。

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句の動作を説明します。

emp_dept_tables

各従業員は1つの部門にのみ所属し、各部門には複数の従業員がいる可能性があります。departmentsemployeesの関係は1対多です。

employeesテーブルのdepartment_id列は、employeesdepartmentsテーブルにリンクする外部キー列です。

部門ID1、2、および3の情報を取得するには、次のステートメントを使用します。

SELECT
	department_id,
	department_name
FROM
	departments
WHERE
	department_id IN (1, 2, 3);Code language: SQL (Structured Query Language) (sql)

試す

SQL INNER JOIN departments table

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)

試す

SQL INNER JOIN employees table

これらの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)

試す

SQL INNER JOIN example

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対多です。

次のデータベース図は、employeesdepartments、およびjobsテーブル間の関係を示しています。

emp_dept_jobs_tables

次のクエリでは、内部結合句を使用して、従業員、部門、およびジョブの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 3 tables example

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

このチュートリアルは役に立ちましたか?