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 |