4-3) MySQL 문법(JOIN)

Hyoin Jeong·2022년 7월 14일

JOIN이란?

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

JOIN 문법

SELECT A.*, B.*
FROM raw_data.table1 A
____ JOIN raw_data.table2 B ON A.key1 = B.key1 and A.key2 = B.key2
WHERE A.ts >= '2019-01-01';
  • ____에 INNER, LEFT, RIGHT, CROSS가 들어감
  • MySQL은 FULL 조인을 지원하지 않음
  • defalut는 INNER

JOIN시 고려해야할 점

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

JOIN의 종류

Untitled

  1. INNER JOIN(이거 자주 사용) - 양쪽에 다 매칭되는 것
  2. LEFT JOIN(이거 자주 사용) - FROM에 사용되는 레코드 전부 + 매칭되는 오른쪽의 정보 → 매칭이 안되는 오른쪽 필드의 정보는 NULL처리됨
  3. RIGHT JOIN
  4. FULL OUTER JOIN
    • MySQL은 이를 지원하지 않음 LEFT JOIN과 RIGHT JOIN을 UNION하는 것으로 이를 대신할 수 있음
  5. SELF JOIN - 자기 자신을 가지고 조인
  6. CROSS JOIN - 양쪽 테이블의 모든 레코드들의 조합(ex) 왼쪽에 a개 오른쪽에 b개의 레코드가 있으면 조인 후 총 a*b개의 레코드 생성) → 조건이 X

실습에 사용되는 테이블 2개

Untitled

  • 시간별 체중의 변화를 측정해서 크면 alert

INNER JOIN

  1. 양쪽 테이블에서 매치가 되는 레코드들만 리턴함
  2. 양쪽 테이블의 필드가 모두 채워진 상태로 리턴됨
SELECT * FROM prod.vital v
JOIN prod.alert a ON v.vital_id = a.vital_id;

결과

Untitled

LEFT JOIN

  1. 왼쪽 테이블(Base)의 모든 레코드들을 리턴함
  2. 오른쪽 테이블의 필드는 왼쪽 레코드와 매칭되는 경우에만 채워진 상태로 리턴됨
SELECT * FROM prod.vital v
LEFT JOIN prod.alert a ON v.vital_id = a.vital_id;

결과

Untitled

FULL JOIN

  1. 왼쪽 테이블과 오른쪽 테이블의 모든 레코드들을 리턴함
  2. 매칭되는 경우에만 양쪽 테이블들의 모든 필드들이 채워진 상태로 리턴됨
  • LEFT JOIN과 RIGHT JOIN과의 UNION으로 사용
    • UNION : 매칭되는 레코드들의 중복X
    • UNION ALL : 매칭되는 레코드들의 중복O
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;

결과(UNION 사용)

Untitled

CROSS JOIN

  1. 왼쪽 테이블과 오른쪽 테이블의 모든 레코드들의 조합을 리턴함
SELECT * FROM prod.vital v CROSS JOIN prod.alert a;

결과

Untitled

SELF JOIN

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

결과

0개의 댓글