데브코스 웹 백엔드/TIL
TIL - (데이터베이스)
ykkkk
2021. 8. 12. 23:26
JOIN
- 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로 바꾸는 것이 가능하다면 변환하여 조인하는 것이 덜 위험
- One to one
- 어느 테이블을 베이스로 잡을지(FROM에 사용할지) 결정해야함
INNER JOIN
- 양쪽 테이블에서 매치가 되는 레코드들만 리턴함
- 양쪽 테이블의 필드가 모두 채워진 상태로 리턴됨
-- Ex
SELECT * FROM PROD.VITAL V
JOIN PROD.ALERT A ON V.VITAL_ID = A.VITAL_ID;
LEFT JOIN
- 왼쪽 테이블(BASE)의 모든 레코드들을 리턴함
- 오른쪽 테이블의 필드는 왼쪽 레코드와 매칭되는 경우에만 채워진 상태로 리턴됨
-- Ex
SELECT * FROM PROD.VITAL V
LEFT JOIN PROD.ALERT A ON V.VITAL_ID = A.VITAL_ID;
FULL JOIN
- 왼쪽 테이블과 오른쪽 테이블의 모든 레코드들을 리턴함
- 매칭되는 경우에만 양쪽 테이블들의 모든 필드들이 채워진 상태로 리턴됨(나머지는 NULL)
MySQL에서는 FULL 조인은 없지만 RIGHT 조인과 LEFT 조인 한 결과를 UNION하여 사용.-- 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;
CROSS JOIN
- 왼쪽 테이블과 오른쪽 테이블의 모든 레코드들의 조합을 리턴함
-- Ex
SELECT * FROM PROD.VITAL V CROSS JOIN PROD.ALERT A;
SELF JOIN
- 동일한 테이블을 ALIAS를 달리해서 자기 자신과 조인함
-- Ex SELECT * FROM prod.vital v1 JOIN prod.vital v2 ON v1.vital_id = v2.vital_id;