PostgreSQLの結合(JOIN)についての解説

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もすべて表示されます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です