영권's

TIL - (데이터베이스) 본문

데브코스 웹 백엔드/TIL

TIL - (데이터베이스)

ykkkk 2021. 8. 12. 23:26

JOIN

  • SQL 조인은 두 개 이상의 테이블들을 공통 필드를 가지고 통합
    • 스타 스키마로 구성된 테이블들로 분산되어 있던 정보를 통합하는데 사용
  • JOIN의 결과로 양쪽의 필드를 모두 가진 새로운 테이블을 만들어짐
    • 조인의 방식에 따라 다음 두 가지가 달라짐
      • 어떤 레코드들이 선택되는지?
      • 어떤 필드들이 채워지는지

출처 : https://velog.io/@chayezo/SQL-JOIN

JOIN 문법

SELECT A.*, B.*
FROM raw_data.table1 A
_/* INner, LEFT, RIGHT, CROSS */ JOIN raw_data.table2 B ON A.key1 = B.key1 and A.key2 = B.key2 
WHERE A.ts >= '2019-01-01';

 

JOIN 시 고려해야 할 점

  • 먼저 중복 레코드가 없고 Primary key의 uniqueness가 보장됨을 체크
    • 매우 중요
  • 조인하는 테이블들간의 관계를 명확하게 정의
    • One to one
      • 완전한 one to one : session & session_channel
      • 한쪽이 부분집합이 되는 one to one
    • One to many? (order vs order_items)
      • 이 경우 중복이 더 큰 문제됨 -> 증폭 !
    • Many to one?
      • 방향만 바꾸면 One to many로 보는 것과 사실상 동일
    • Many to many?
      • 이는 one to one 이나 one to many로 바꾸는 것이 가능하다면 변환하여 조인하는 것이 덜 위험
  • 어느 테이블을 베이스로 잡을지(FROM에 사용할지) 결정해야함

 

INNER JOIN

  1. 양쪽 테이블에서 매치가 되는 레코드들만 리턴함
  2. 양쪽 테이블의 필드가 모두 채워진 상태로 리턴됨
-- Ex
SELECT * FROM PROD.VITAL V
JOIN PROD.ALERT A ON V.VITAL_ID = A.VITAL_ID;

LEFT JOIN

  1. 왼쪽 테이블(BASE)의 모든 레코드들을 리턴함
  2. 오른쪽 테이블의 필드는 왼쪽 레코드와 매칭되는 경우에만 채워진 상태로 리턴됨
-- Ex
SELECT * FROM PROD.VITAL V
LEFT JOIN PROD.ALERT A ON V.VITAL_ID = A.VITAL_ID;

 

FULL JOIN

  1. 왼쪽 테이블과 오른쪽 테이블의 모든 레코드들을 리턴함
  2. 매칭되는 경우에만 양쪽 테이블들의 모든 필드들이 채워진 상태로 리턴됨(나머지는 NULL)
    -- Ex
    SELECT * FROM PROD.VITAL V
    LEFT JOIN PROD.ALERT A ON V.VITAL_ID = A.VITAL_ID
    UNION -- VS. UNION ALL
    SELECT * FROM PROD.VITAL V
    RIGHT JOIN PROD.ALERT A ON V.VITAL_ID = A.VITAL_ID;​
    MySQL에서는 FULL 조인은 없지만 RIGHT 조인과 LEFT 조인 한 결과를 UNION하여 사용.

CROSS JOIN

  1. 왼쪽 테이블과 오른쪽 테이블의 모든 레코드들의 조합을 리턴함
-- Ex
SELECT * FROM PROD.VITAL V CROSS JOIN PROD.ALERT A;

 

SELF JOIN

  1. 동일한 테이블을 ALIAS를 달리해서 자기 자신과 조인함
    -- Ex
    SELECT * FROM prod.vital v1
    JOIN prod.vital v2 ON v1.vital_id = v2.vital_id;
Comments