PostgreSQLの結合(JOIN)についての解説
内部結合(INNER JOIN)
内部結合(INNER JOIN)は、二つのテーブルの共通部分、つまり両方のテーブルに存在する行のみを結合して結果を返します。例えば、社員テーブルと部署テーブルがあった場合、両方に関連する社員のみを取得することができます。内部結合では、条件に一致するデータのみが取得されます。
例えば、次のようなSQL文で内部結合を行います:
SELECT employees.name, departments.name FROM employees INNER JOIN departments ON employees.department_id = departments.id;
このクエリでは、社員テーブルと部署テーブルをdepartment_idとidで結合し、両方のテーブルに存在する行(社員と部署が一致する行)を表示します。
左外部結合(LEFT JOIN)
左外部結合(LEFT JOIN)は、左側のテーブル(左テーブル)のすべての行を取得し、右側のテーブル(右テーブル)と一致する行があればその値を結合します。右側のテーブルに一致する行がない場合は、NULLが返されます。
例えば、次のようなSQL文で左外部結合を行います:
SELECT employees.name, departments.name FROM employees LEFT JOIN departments ON employees.department_id = departments.id;
このクエリでは、社員テーブルのすべての行を取得し、部署テーブルと結合します。部署に所属していない社員にはNULLが表示されます。
右外部結合(RIGHT JOIN)
右外部結合(RIGHT JOIN)は、右側のテーブル(右テーブル)のすべての行を取得し、左側のテーブル(左テーブル)と一致する行があればその値を結合します。左側のテーブルに一致する行がない場合は、NULLが返されます。
例えば、次のようなSQL文で右外部結合を行います:
SELECT employees.name, departments.name FROM employees RIGHT JOIN departments ON employees.department_id = departments.id;
このクエリでは、部署テーブルのすべての行を取得し、社員テーブルと結合します。社員がいない部署にはNULLが表示されます。
完全外部結合(FULL JOIN)
完全外部結合(FULL JOIN)は、左側と右側のテーブルの両方のすべての行を取得します。両方のテーブルに一致する行があれば結合され、一致しない行はNULLが表示されます。両テーブルに対して外部結合を行うため、結果には両方のテーブルからのすべてのデータが含まれます。
例えば、次のようなSQL文で完全外部結合を行います:
SELECT employees.name, departments.name FROM employees FULL JOIN departments ON employees.department_id = departments.id;
このクエリでは、社員テーブルと部署テーブルのすべての行を結合し、一致しない行にはNULLが表示されます。
クロス結合(CROSS JOIN)
クロス結合(CROSS JOIN)は、両方のテーブルのすべての組み合わせを結合します。クロス結合では、テーブル同士が無条件に全組み合わせを出力するため、非常に多くの行が結果として返されることになります。条件は指定せず、単純にテーブル間の組み合わせを生成します。
例えば、次のようなSQL文でクロス結合を行います:
SELECT employees.name, departments.name FROM employees CROSS JOIN departments;
このクエリでは、社員テーブルと部署テーブルのすべての組み合わせを返します。例えば、社員が10人、部署が5つあれば、結果は50行の組み合わせになります。
結果結合(UNION)
結果結合(UNION)は、二つのクエリの結果を結合する操作です。ただし、重複する行は一度だけ表示されます。UNION ALLを使用すると、重複する行も含めてすべての行を表示します。UNIONは、異なるテーブルの結果を一つの結果としてまとめたいときに有用です。
例えば、次のようなSQL文で結果結合を行います:
SELECT name FROM employees UNION SELECT name FROM contractors;
このクエリでは、社員テーブルと契約社員テーブルからnameカラムを取得し、重複しないように結合します。同様の結果を重複なしでまとめたい場合に使用します。
もし重複を許可したい場合は、UNION ALLを使います:
SELECT name FROM employees UNION ALL SELECT name FROM contractors;
これにより、重複するnameもすべて表示されます。