第9章 JOIN句

準備

まずは、2つのテーブルを作成してデータを挿入し、その後でJOIN句の概念を説明します。

Employees テーブルを作成します。

CREATE TABLE Employees (
    EmployeeID int,
    Name varchar(255),
    DepartmentID int
);

INSERT INTO Employees (EmployeeID, Name, DepartmentID)
VALUES (1, 'Bob', 1), (2, 'Alice', 2), (3, 'Charlie', 3), (4, 'Daniel', NULL);

Departments テーブルを作成します。

CREATE TABLE Departments (
    DepartmentID int,
    DepartmentName varchar(255)
);

INSERT INTO Departments (DepartmentID, DepartmentName)
VALUES (1, 'HR'), (2, 'Sales'), (3, 'IT'), (5, 'Marketing');

これで、テーブルとデータが用意できました。


INNER JOIN

両方のテーブルに存在する行だけを返します。

このクエリは、両方のテーブルに存在するデータ(つまり、EmployeesテーブルのDepartmentIDDepartmentsテーブルに存在するデータ)だけを取得します。その結果、以下のようなデータが取得されます。

SELECT Employees.Name, Departments.DepartmentName
FROM Employees
INNER JOIN Departments ON Employees.DepartmentID = Departments.DepartmentID;
+---------+----------------+
| Name    | DepartmentName |
+---------+----------------+
| Bob     | HR             |
| Alice   | Sales          |
| Charlie | IT             |
+---------+----------------+


LEFT JOIN (または LEFT OUTER JOIN)

左のテーブルにある全ての行と、それらの行に一致する右のテーブルの行を返します。右のテーブルに一致する行がない場合は、NULLが返されます。

このクエリは、Employeesテーブルのすべてのデータを取得し、可能な場合はDepartmentsテーブルのデータと結合します。その結果、以下のようなデータが取得されます。

SELECT Employees.Name, Departments.DepartmentName
FROM Employees
LEFT JOIN Departments ON Employees.DepartmentID = Departments.DepartmentID;
+---------+----------------+
| Name    | DepartmentName |
+---------+----------------+
| Bob     | HR             |
| Alice   | Sales          |
| Charlie | IT             |
| Daniel  | NULL           |
+---------+----------------+


RIGHT JOIN (または RIGHT OUTER JOIN)

右のテーブルにある全ての行と、それらの行に一致する左のテーブルの行を返します。左のテーブルに一致する行がない場合は、NULLが返されます。

このクエリは、Departmentsテーブルのすべてのデータを取得し、可能な場合はEmployeesテーブルのデータと結合します。その結果、以下のようなデータが取得されます。

SELECT Employees.Name, Departments.DepartmentName
FROM Employees
RIGHT JOIN Departments ON Employees.DepartmentID = Departments.DepartmentID;
+---------+----------------+
| Name    | DepartmentName |
+---------+----------------+
| Bob     | HR             |
| Alice   | Sales          |
| Charlie | IT             |
| NULL    | Marketing      |
+---------+----------------+