[SQL] JOIN

·2023년 5월 11일
0

SQL

목록 보기
3/3
post-custom-banner

1. JOIN


이미지 출처: https://theartofpostgresql.com/blog/2019-09-sql-joins/

  • 두 개 혹은 그 이상의 테이블을 공통 필드(특정 KEY)를 가지고 MERGE 할 때 사용된다.
  • 스타 스키마로 분산되어 있는 정보를 통합하는데 사용한다.
  • 기본적인 JOIN의 문법은 이와 같다.
SELECT A.*
     , B.*
  FROM TABLE1 A
_ JOIN TABLE2 B    -- JOIN 앞의 _에 LEFT, INNER, RIGHT, CROSS, FULL이 들어가게 된다
    ON A.KEY1 = B.KEY1 
   AND A.KEY2 = B.KEY2;

2. JOIN 시 고려해야 할 점

  • 먼저 중복 레코드가 없고 Primary Key의 uniqueness가 보장되어야 한다. (JOIN을 하기에 앞서 항상 데이터의 정확성을 검증해야 한다.)

  • 조인하는 테이블들간의 관계를 명확하게 정의해야 한다.

    • ONE TO ONE
      • 완전한 ONE TO ONE한쪽이 부분 집합이 되는 ONE TO ONE이 존재한다.
    • ONE TO MANY & MANY TO ONE
      • 예를 들어 EMPLOYEE 테이블과 DEPARTMENT 테이블이 있다고 했을 때 DEPARTMENT 관점에서 하나의 지점에 여러 직원이 속할 수 있으므로 둘은 ONE TO MANY 관계이다.
        • 중복이 존재한다면 데이터가 증폭되는 문제가 발생할 수 있음.
    • MANY TO MANY
  • 어떤 테이블을 베이스로 잡을지(FROM에 사용할지) 결정해야 함.


3. JOIN의 종류

💻 이 포스트에서는 이 두 테이블을 이용해 JOIN에 대해 정리하였다.

  • raw_data.Vital은 환자의 Vital 측정 정보를 담고 있는 테이블이다.
  • raw_data.Alert은 환자의 Alert 정보를 담고 있는 테이블로 Vital과 관련하여 변화가 발생하였다면 Alert 테이블에 정보가 쌓이게 된다.

1) INNER JOIN

  • 양쪽 테이블에서 매치되는 레코드들만 리턴한다.
  • 양쪽 테이블에서 매치되는 레코드들만 리턴하기 때문에 양쪽 필드가 모두 채워진 상태로 리턴된다.
  • INNER JOIN의 경우 INNER JOIN이라고 해도 되고 JOIN만 써 주어도 default로 INNER JOIN이 된다.
SELECT *
  FROM RAW_DATA.VITAL V
  JOIN RAW_DATA.ALERT A
    ON V.VITALID = A.VITALID;
  • 결과
  • KEY인 VITALID가 매칭되는 데이터가 하나밖에 존재하지 않는다. 나머지 ALERT 테이블의 데이터는 VITALID가 NULL이기 때문에 다음과 같은 하나의 데이터가 나오게 된다.

2) LEFT JOIN

  • 왼쪽 테이블을 기준으로 모든 레코드들을 리턴한다.
  • 만약 오른쪽 테이블의 데이터 중 왼쪽 레코드와 매칭이 되는 경우가 있다면 왼쪽 레코드와 매칭된 경우만 채워진 상태로 리턴된다.
SELECT *
  FROM RAW_DATA.VITAL V
  LEFT JOIN RAW_DATA.ALERT A
         ON V.VITALID = A.VITALID;
  • 결과
  • Python 코드에서는 NULLNONE으로 나오게 된다.
  • VITAL 테이블의 네 개의 데이터 중 하나만이 ALERT 테이블과 매칭되기 때문에 이 케이스만 데이터가 나오게 되고 나머지는 ALERT 테이블의 값이 NONE으로 나오게 된다.

3) RIGHT JOIN

  • 오른쪽 테이블을 기준으로 모든 레코드들을 리턴한다.
  • LEFT JOIN과 방향만 바뀐 개념으로 만약 왼쪽 테이블의 데이터 중 오른쪽 레코드와 매칭되는 경우가 있다면 오른쪽 레코드와 매칭되는 경우만 채워진 상태로 리턴된다.
SELECT *
  FROM RAW_DATA.VITAL V
 RIGHT JOIN RAW_DATA.ALERT A
         ON V.VITALID = A.VITALID;
  • 결과
  • ALERT 테이블의 세 개의 데이터 중 하나만이 VITAL 테이블과 매칭되기 때문에 이 케이스만 데이터가 나오게 되고 나머지는 VITAL 테이블의 값이 NONE으로 나오게 된다.

4) FULL JOIN

  • 왼쪽 테이블과 오른쪽 테이블의 모든 레코드들을 리턴한다.
  • 매칭되는 경우에만 양쪽 테이블들의 모든 필드들이 채워진 상태로 리턴된다.
SELECT *
  FROM raw_data.Vital V
FULL JOIN raw_data.Alert A
       ON V.VITALID = A.VITALID
  • 결과
  • VITAL 테이블과 ALERT 테이블의 모든 데이터가 나온 것을 볼 수 있다. 다만 매칭이 되는 데이터가 있다면 매칭이 되어 나오게 된다.

5) CROSS JOIN

  • 왼쪽 테이블과 오른쪽 테이블의 모든 레코드들의 조합을 리턴한다.
  • VITAL 테이블에는 네 개의 데이터가 있었고, ALERT 테이블에는 세 개의 데이터가 존재하는데 이런 경우 4 * 3 = 12 개의 데이터가 조합돼서 나온다.
  • CROSS JOIN은 JOIN한 테이블 데이터 사이에서 나올 수 있는 모든 경우의 수를 조합해 주기 때문에 ON 절을 통해 KEY를 매칭해 줄 필요가 없다.
SELECT *
  FROM RAW_DATA.VITAL V
CROSS JOIN RAW_DATA.ALERT A;
  • 결과
  • ALERT 테이블의 세 개의 데이터와 VITAL 테이블의 네 개의 데이터의 모든 조합이 나오게 된다. 총 열두 개의 데이터가 나오는 것을 확인할 수 있다.

6) SELF JOIN

  • 동일한 테이블을 alias를 달리 해서 자기 자신과 조인한다.
  • 예시는 기본적인 문법이지만 보통 SELF 조인은 같은 테이블에서 특정 정보를 뽑고자 할 때 각각 다른 조건을 주어야 하는 경우 사용한다.
SELECT *
  FROM raw_data.Vital V1
  JOIN raw_data.Vital V2
    ON V1.VITALID = V2.VITALID
profile
송의 개발 LOG
post-custom-banner

0개의 댓글