PostgreSQL-조인
PostgreSQL Joins절은 데이터베이스에있는 둘 이상의 테이블에서 레코드를 결합하는 데 사용됩니다. JOIN은 각각에 공통된 값을 사용하여 두 테이블의 필드를 결합하는 수단입니다.
PostgreSQL의 조인 유형은 다음과 같습니다.
- 크로스 조인
- 내부 조인
- 왼쪽 외부 조인
- 올바른 외부 결합
- 완전한 외부 조인
계속하기 전에 COMPANY 및 DEPARTMENT라는 두 개의 테이블을 고려해 보겠습니다. COMPANY 테이블을 채우는 INSERT 문을 이미 보았습니다. 따라서 COMPANY 테이블에서 사용 가능한 레코드 목록을 가정 해 보겠습니다.
id | name | age | address | salary | join_date
----+-------+-----+-----------+--------+-----------
1 | Paul | 32 | California| 20000 | 2001-07-13
3 | Teddy | 23 | Norway | 20000 |
4 | Mark | 25 | Rich-Mond | 65000 | 2007-12-13
5 | David | 27 | Texas | 85000 | 2007-12-13
2 | Allen | 25 | Texas | | 2007-12-13
8 | Paul | 24 | Houston | 20000 | 2005-07-13
9 | James | 44 | Norway | 5000 | 2005-07-13
10 | James | 45 | Texas | 5000 | 2005-07-13
다른 테이블은 DEPARTMENT이며 다음과 같은 정의가 있습니다.
CREATE TABLE DEPARTMENT(
ID INT PRIMARY KEY NOT NULL,
DEPT CHAR(50) NOT NULL,
EMP_ID INT NOT NULL
);
다음은 DEPARTMENT 테이블을 채우는 INSERT 문 목록입니다.
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은 첫 번째 테이블의 모든 행을 두 번째 테이블의 모든 행과 일치시킵니다. 입력 테이블에 각각 x 및 y 열이있는 경우 결과 테이블에는 x + y 열이 있습니다. CROSS JOIN은 매우 큰 테이블을 생성 할 가능성이 있으므로 적절한 경우에만 사용하도록주의해야합니다.
다음은 CROSS JOIN의 구문입니다-
SELECT ... FROM table1 CROSS JOIN table2 ...
위의 테이블을 기반으로 다음과 같이 CROSS JOIN을 작성할 수 있습니다.
testdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY CROSS JOIN DEPARTMENT;
위의 주어진 쿼리는 다음 결과를 생성합니다-
emp_id| name | dept
------|-------|--------------
1 | Paul | IT Billing
1 | Teddy | IT Billing
1 | Mark | IT Billing
1 | David | IT Billing
1 | Allen | IT Billing
1 | Paul | IT Billing
1 | James | IT Billing
1 | James | IT Billing
2 | Paul | Engineering
2 | Teddy | Engineering
2 | Mark | Engineering
2 | David | Engineering
2 | Allen | Engineering
2 | Paul | Engineering
2 | James | Engineering
2 | James | Engineering
7 | Paul | Finance
7 | Teddy | Finance
7 | Mark | Finance
7 | David | Finance
7 | Allen | Finance
7 | Paul | Finance
7 | James | Finance
7 | James | Finance
내부 조인
INNER JOIN은 join-predicate를 기반으로 두 테이블 (table1 및 table2)의 열 값을 결합하여 새 결과 테이블을 만듭니다. 쿼리는 table1의 각 행을 table2의 각 행과 비교하여 join-predicate를 충족하는 모든 행 쌍을 찾습니다. join-predicate가 충족되면 table1 및 table2의 일치하는 각 행 쌍에 대한 열 값이 결과 행으로 결합됩니다.
INNER JOIN은 가장 일반적인 조인 유형이며 기본 조인 유형입니다. INNER 키워드를 선택적으로 사용할 수 있습니다.
다음은 INNER JOIN의 구문입니다-
SELECT table1.column1, table2.column2...
FROM table1
INNER JOIN table2
ON table1.common_filed = table2.common_field;
위의 테이블을 기반으로 다음과 같이 INNER JOIN을 작성할 수 있습니다.
testdb=# 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
왼쪽 외부 조인
OUTER JOIN은 INNER JOIN의 확장입니다. SQL 표준은 LEFT, RIGHT 및 FULL의 세 가지 유형의 OUTER JOIN을 정의하며 PostgreSQL은이 모든 것을 지원합니다.
LEFT OUTER JOIN의 경우 먼저 내부 조인이 수행됩니다. 그런 다음 테이블 T2의 어떤 행과도 조인 조건을 만족하지 않는 테이블 T1의 각 행에 대해 T2의 열에 널 값으로 조인 된 행이 추가됩니다. 따라서 조인 된 테이블에는 항상 T1의 각 행에 대해 하나 이상의 행이 있습니다.
다음은 LEFT OUTER JOIN의 구문입니다-
SELECT ... FROM table1 LEFT OUTER JOIN table2 ON conditional_expression ...
위의 테이블을 기반으로 다음과 같이 내부 조인을 작성할 수 있습니다.
testdb=# 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
| James |
| David |
| Paul |
| Mark |
| Teddy |
| James |
올바른 외부 결합
먼저 내부 조인이 수행됩니다. 그런 다음 테이블 T1의 행과 결합 조건을 충족하지 않는 테이블 T2의 각 행에 대해 결합 된 행이 T1의 열에 널값으로 추가됩니다. 이것은 왼쪽 조인의 반대입니다. 결과 테이블에는 항상 T2의 각 행에 대한 행이 있습니다.
다음은 RIGHT OUTER JOIN의 구문입니다-
SELECT ... FROM table1 RIGHT OUTER JOIN table2 ON conditional_expression ...
위의 테이블을 기반으로 다음과 같이 내부 조인을 작성할 수 있습니다.
testdb=# 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 | | Finance
완전한 외부 조인
먼저 내부 조인이 수행됩니다. 그런 다음 테이블 T2의 어떤 행과도 조인 조건을 만족하지 않는 테이블 T1의 각 행에 대해 T2의 열에 널 값으로 조인 된 행이 추가됩니다. 또한 T1의 어떤 행과도 결합 조건을 만족하지 않는 T2의 각 행에 대해 T1의 열에 널값이있는 결합 된 행이 추가됩니다.
다음은 FULL OUTER JOIN의 구문입니다.
SELECT ... FROM table1 FULL OUTER JOIN table2 ON conditional_expression ...
위의 테이블을 기반으로 다음과 같이 내부 조인을 작성할 수 있습니다.
testdb=# 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 | | Finance
| James |
| David |
| Paul |
| Mark |
| Teddy |
| James |