PostgreSQL 結合(JOIN)
PostgreSQL の JOIN 句は、2つ以上のテーブルの行を、それらのテーブル間の共通フィールドに基づいて結合するために使用されます。
PostgreSQL では、JOIN には5つの結合タイプがあります:
- CROSS JOIN :交差結合
- INNER JOIN:内部結合
- LEFT OUTER JOIN:左外部結合
- RIGHT OUTER JOIN:右外部結合
- FULL OUTER JOIN:完全外部結合
次に、2つのテーブルを作成しましょうCOMPANYとDEPARTMENT。
例
COMPANY テーブルを作成します(COMPANY SQL ファイルをダウンロード)、データ内容は以下のとおりです:
サンプルdb# select * from COMPANY; id | name | age | address | salary ----+-------+-----+-----------+-------- 1 | Paul | 32 | California| 20000 2 | Allen | 25 | Texas | 15000 3 | Teddy | 23 | Norway | 20000 4 | Mark | 25 | Rich-Mond | 65000 5 | David | 27 | Texas | 85000 6 | Kim | 22 | South-Hall| 45000 7 | James | 24 | Houston | 10000 (7 rows)
テーブルにいくつかのデータを追加します:
INSERT INTO COMPANY VALUES (8, 'Paul', 24, 'Houston', 20000.00); INSERT INTO COMPANY VALUES (9, 'James', 44, 'Norway', 5000.00); INSERT INTO COMPANY VALUES (10, 'James', 45, 'Texas', 5000.00);
このとき、COMPANY テーブルのレコードは以下のとおりです:
id | name | age | address | salary ----+-------+-----+--------------+-------- 1 | Paul | 32 | California | 20000 2 | Allen | 25 | Texas | 15000 3 | Teddy | 23 | Norway | 20000 4 | Mark | 25 | Rich-Mond | 65000 5 | David | 27 | Texas | 85000 6 | Kim | 22 | South-Hall | 45000 7 | James | 24 | Houston | 10000 8 | Paul | 24 | Houston | 20000 9 | James | 44 | Norway | 5000 10 | James | 45 | Texas | 5000 (10 rows)
DEPARTMENT テーブルを作成し、3つのフィールドを追加します:
CREATE TABLE DEPARTMENT( ID INT PRIMARY KEY NOT NULL, DEPT CHAR(50) NOT NULL, EMP_ID INT NOT NULL );
DEPARTMENT テーブルに3つのレコードを挿入します:
INSERT INTO DEPARTMENT (ID, DEPT, EMP_ID) VALUES (1, 'IT Billing', 1 ); INSERT INTO DEPARTMENT (ID, DEPT, EMP_ID) VALUES (2, 'Engineering', 2 ); INSERT INTO DEPARTMENT (ID, DEPT, EMP_ID) VALUES (3, 'Finance', 7 );
このとき、DEPARTMENT テーブルのレコードは以下のとおりです:
id | dept | emp_id ----+-------------+-------- 1 | IT Billing | 1 2 | Engineering | 2 3 | Finance | 7
交差結合
交差結合(CROSS JOIN)は、最初のテーブルの各行を2番目のテーブルの各行とマッチングさせます。2つの入力テーブルがそれぞれ x 行と y 行ある場合、結果テーブルは x*y 行になります。
交差結合(CROSS JOIN)は非常に大きなテーブルを生成する可能性があるため、使用時には注意が必要で、適切な場合にのみ使用してください。
以下は CROSS JOIN の基本構文です:
SELECT ... FROM table1 CROSS JOIN table2 ...
上記のテーブルに基づいて、次のように交差結合(CROSS JOIN)を記述できます:
サンプルdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY CROSS JOIN DEPARTMENT;
得られる結果は以下のとおりです:
サンプルdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY CROSS JOIN DEPARTMENT;
emp_id | name | dept
--------+-------+--------------------
1 | Paul | IT Billing
1 | Allen | IT Billing
1 | Teddy | IT Billing
1 | Mark | IT Billing
1 | David | IT Billing
1 | Kim | IT Billing
1 | James | IT Billing
1 | Paul | IT Billing
1 | James | IT Billing
1 | James | IT Billing
2 | Paul | Engineering
2 | Allen | Engineering
2 | Teddy | Engineering
2 | Mark | Engineering
2 | David | Engineering
2 | Kim | Engineering
2 | James | Engineering
2 | Paul | Engineering
2 | James | Engineering
2 | James | Engineering
7 | Paul | Finance
内部結合
内部結合(INNER JOIN)は、結合述語に基づいて2つのテーブル(table1 と table2)の列値を組み合わせて、新しい結果テーブルを作成します。クエリは table1 の各行を table2 の各行と比較し、結合述語を満たす行の一致ペアをすべて見つけます。
結合述語を満たす場合、A 行と B 行の各一致ペアの列値が1つの結果行に結合されます。
内部結合(INNER JOIN)は最も一般的な結合タイプであり、デフォルトの結合タイプです。
INNER キーワードは省略可能です。
以下は内部結合(INNER JOIN)の構文です:
SELECT table1.column1, table2.column2... FROM table1 INNER JOIN table2 ON table1.common_filed = table2.common_field;
上記のテーブルに基づいて、次のように内部結合を記述できます:
サンプルdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY INNER JOIN DEPARTMENT ON COMPANY.ID = DEPARTMENT.EMP_ID;
emp_id | name | dept
--------+-------+--------------
1 | Paul | IT Billing
2 | Allen | Engineering
7 | James | Finance
(3 rows)
左外部結合
外部結合は内部結合の拡張です。SQL 標準では、LEFT、RIGHT、FULL の3種類の外部結合が定義されており、PostgreSQL はこれらすべてをサポートしています。
左外部結合では、まず内部結合が実行されます。次に、テーブル T2 の結合条件を満たさないテーブル T1 の各行について、T2 の列に null 値がある場合も結合行が追加されます。したがって、結合されたテーブルには、T1 の各行に対して少なくとも1行があります。
以下は左外部結合(LEFT OUTER JOIN)の基本構文です:
SELECT ... FROM table1 LEFT OUTER JOIN table2 ON conditional_expression ...
上記の2つのテーブルに基づいて、次のように左外部結合を記述できます:
サンプルdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY LEFT OUTER JOIN DEPARTMENT ON COMPANY.ID = DEPARTMENT.EMP_ID;
emp_id | name | dept
--------+-------+----------------
1 | Paul | IT Billing
2 | Allen | Engineering
7 | James | Finance
| James |
| David |
| Paul |
| Kim |
| Mark |
| Teddy |
| James |
(10 rows)
右外部結合
まず、内部結合が実行されます。次に、テーブル T1 の結合条件を満たさないテーブル T2 の各行について、T1 の列の値が null の場合も結合行が追加されます。これは左結合の逆です。T2 の各行に対して、結果テーブルには常に1行があります。
以下は右外部結合(RIGHT OUT JOIN)の基本構文です:
SELECT ... FROM table1 RIGHT OUTER JOIN table2 ON conditional_expression ...
上記の2つのテーブルに基づいて、右外部結合を確立します:
サンプルdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY RIGHT OUTER JOIN DEPARTMENT ON COMPANY.ID = DEPARTMENT.EMP_ID;
emp_id | name | dept
--------+-------+-----------------
1 | Paul | IT Billing
2 | Allen | Engineering
7 | James | Finance
(3 rows)
外部結合
まず、内部結合が実行されます。次に、テーブル T2 のいずれかの行の結合条件を満たさないテーブル T1 の各行について、T2 の列に null 値がある場合も結果に追加されます。さらに、T1 のいずれかの行との結合条件を満たさない T2 の各行について、T1 の列に null 値を含む行が結果に追加されます。
以下は外部結合の基本構文です:
SELECT ... FROM table1 FULL OUTER JOIN table2 ON conditional_expression ...
上記の2つのテーブルに基づいて、外部結合を確立できます:
サンプルdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY FULL OUTER JOIN DEPARTMENT ON COMPANY.ID = DEPARTMENT.EMP_ID;
emp_id | name | dept
--------+-------+-----------------
1 | Paul | IT Billing
2 | Allen | Engineering
7 | James | Finance
| James |
| David |
| Paul |
| Kim |
| Mark |
| Teddy |
| James |
(10 rows)
その他の拡張