1. 結合の基本概念
結合(JOIN)は、複数のテーブルから関連するデータを一つの結果セットとして取得するためのSQL操作です。結合の基本構文は次のとおりです:
SELECT columns
FROM table1
JOIN table2
ON table1.common_column = table2.common_column;
2. 主な結合の種類
MySQLにはいくつかの結合の種類がありますが、主に以下の4つがよく使用されます:
- 内部結合(INNER JOIN)
- 左外部結合(LEFT JOIN)
- 右外部結合(RIGHT JOIN)
- 完全外部結合(FULL JOIN) - MySQLでは直接サポートされていませんが、 UNIONを使用して実現可能です。
3. 内部結合(INNER JOIN)
内部結合は、結合条件に一致するレコードのみを返します。どちらのテーブルにも一致するデータがある場合にのみ結果セットに含まれます。
内部結合の構文
SELECT columns
FROM table1
INNER JOIN table2
ON table1.common_column = table2.common_column;
内部結合の例
SELECT employees.name, departments.department_name
FROM employees
INNER JOIN departments
ON employees.department_id = departments.id;
このクエリは、employees
テーブルとdepartments
テーブルをdepartment_id
で結合し、各従業員の名前と所属部署を取得します。
4. 左外部結合(LEFT JOIN)
左外部結合は、左側のテーブルのすべてのレコードと、結合条件に一致する右側のテーブルのレコードを返します。一致しない場合、右側のテーブルの値はNULLになります。
左外部結合の構文
SELECT columns
FROM table1
LEFT JOIN table2
ON table1.common_column = table2.common_column;
左外部結合の例
SELECT employees.name, departments.department_name
FROM employees
LEFT JOIN departments
ON employees.department_id = departments.id;
このクエリは、employees
テーブルのすべての従業員と、departments
テーブルの一致する部署を取得します。部署がない従業員については、department_name
がNULLになります。
5. 右外部結合(RIGHT JOIN)
右外部結合は、右側のテーブルのすべてのレコードと、結合条件に一致する左側のテーブルのレコードを返します。一致しない場合、左側のテーブルの値はNULLになります。
右外部結合の構文
SELECT columns
FROM table1
RIGHT JOIN table2
ON table1.common_column = table2.common_column;
右外部結合の例
SELECT employees.name, departments.department_name
FROM employees
RIGHT JOIN departments
ON employees.department_id = departments.id;
このクエリは、departments
テーブルのすべての部署と、employees
テーブルの一致する従業員を取得します。従業員がいない部署については、name
がNULLになります。
6. 完全外部結合(FULL JOIN)
完全外部結合は、左側および右側の両方のテーブルのすべてのレコードを返します。MySQLでは直接サポートされていないため、UNIONを使用して実現します。
完全外部結合の構文
SELECT columns
FROM table1
LEFT JOIN table2
ON table1.common_column = table2.common_column
UNION
SELECT columns
FROM table1
RIGHT JOIN table2
ON table1.common_column = table2.common_column;
完全外部結合の例
SELECT employees.name, departments.department_name
FROM employees
LEFT JOIN departments
ON employees.department_id = departments.id
UNION
SELECT employees.name, departments.department_name
FROM employees
RIGHT JOIN departments
ON employees.department_id = departments.id;
このクエリは、employees
テーブルとdepartments
テーブルの両方のすべてのレコードを取得し、一致しない場合はNULL値を含めます。
7. クロス結合(CROSS JOIN)
クロス結合は、2つのテーブルのすべての組み合わせを返します。結合条件がなく、2つのテーブルの各行が組み合わせられます。
クロス結合の構文
SELECT columns
FROM table1
CROSS JOIN table2;
クロス結合の例
SELECT employees.name, departments.department_name
FROM employees
CROSS JOIN departments;
このクエリは、employees
テーブルとdepartments
テーブルのすべての組み合わせを取得します。結果セットの行数は、employees
テーブルの行数とdepartments
テーブルの行数の積になります。