English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

PostgreSQL 연결(JOIN)

PostgreSQL JOIN 문은 두 개나 더 많은 테이블에서의 행을 결합하는 데 사용되며, 이 테이블 간의 공통 필드를 기반으로 합니다。

PostgreSQL에서 JOIN은 다섯 가지 연결 유형이 있습니다:

  • CROSS JOIN :교차 조인

  • INNER JOIN:내부 조인

  • LEFT OUTER JOIN:왼쪽 외부 조인

  • RIGHT OUTER JOIN:오른쪽 외부 조인

  • FULL OUTER JOIN:전체 외부 조인

그래서 두 개의 테이블을 생성해 보겠습니다 COMPANYDEPARTMENT

온라인 예제

COMPANY 테이블 생성(COMPANY SQL 파일 다운로드 ),데이터 내용은 다음과 같습니다:

w3codeboxdb# 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 表,添加三个字段:

CREATE TABLE DEPARTMENT(
   ID INT PRIMARY KEY      NOT NULL,
   DEPT           CHAR(50) NOT NULL,
   EMP_ID         INT      NOT NULL
);

向 DEPARTMENT 表插入三条记录:

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 테이블1 CROSS JOIN table2 ...

基于上面的表,我们可以写一个交叉连接(CROSS JOIN),如下所示:

w3codeboxdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY CROSS JOIN DEPARTMENT;

得到结果如下:

w3codeboxdb=# 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)은 두 테이블(table1 과 table2를 사용하여 새로운 결과 테이블을 생성합니다. 쿼리는 table1 의 각 행을 table2  의 각 행을 비교하여 모든 조인 문장자를 만족하는 행의 일치 쌍을 찾습니다.

조인 문장자가 만족될 때, A와 B 행의 각 일치 행의 열 값이 하나의 결과 행으로 병합됩니다.

내부 조인(INNER JOIN)은 가장 일반적인 조인 유형으로, 기본 조인 유형입니다.

INNER 키워드는 선택 사항입니다.

아래는 내부 조인(INNER JOIN)의 문법입니다:

SELECT table1.column1, table2.column2...
FROM table1
INNER JOIN table2
ON table1.common_filed = table2.common_field;

위 테이블을 기반으로 내부 조인을 작성할 수 있습니다. 다음과 같습니다:

w3codeboxdb=# 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, AND FULL, PostgreSQL는 모든 것을 지원합니다.

왼쪽 외부 조인에서는 먼저 내부 조인을 실행합니다. 그런 다음, 테이블 T1 에서 테이블 T2 의 조인 조건의 각 행에 대해 추가됩니다. 여기서 T2 의 열에 NULL 값이 있더라도 추가된 조인 행이 있습니다. 따라서, 조인된 테이블은 T1 중에서 매 행은 최소한 한 행이 있습니다.

아래는 왼쪽 외부 조인(LEFT OUTER JOIN)의 기본 문법입니다:

SELECT ... FROM 테이블1 LEFT OUTER JOIN table2 ON 조건식...

기반으로 양쪽 테이블을 사용하여 왼쪽 외부 조인을 작성할 수 있습니다.:

w3codeboxdb=# 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)

오른쪽 외부 조인

먼저 내부 조인을 실행합니다. 그런 다음, 테이블 T2에서 테이블 T1에서 테이블 T1에서 연결 조건을 만족하는 모든 행에 대해, T2의 열의值为空도 연결 행이 추가됩니다. 이는 왼쪽 조인과 반대입니다; T

의 모든 행에 대해, 결과 테이블에 항상 행이 하나 있습니다.

SELECT ... FROM 테이블1 RIGHT OUTER JOIN 테이블2 ON 조건식...

위 두 테이블을 기반으로 오른쪽 외부 조인을 설정합니다:

w3codeboxdb=# 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)

외부 조인

먼저 내부 조인을 실행합니다. 그런 다음, 테이블 T1 에서 테이블 T2 에서 연결 조건을 만족하는 모든 행에 대해, T2 의 열에 null 값이 있어도 결과에 추가됩니다. 또한, T2 에서 만족하지 않는 행도 추가됩니다.1 의 모든 행이 연결 조건을 만족하는 경우, T1 null 값을 포함한 열이 결과에 포함됩니다.

외부 조인의 기본 문법은 다음과 같습니다:

SELECT ... FROM 테이블1 FULL OUTER JOIN 테이블2 ON 조건식...

위 두 테이블을 기반으로 외부 조인을 설정할 수 있습니다:

w3codeboxdb=# 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)