영권's
TIL - (데이터베이스) 본문
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;
'데브코스 웹 백엔드 > TIL' 카테고리의 다른 글
2021-08-16 TIL (Build) (0) | 2021.08.16 |
---|---|
2021-08-13 TIL (데이터베이스 - 트랜잭션,VIEW) (0) | 2021.08.14 |
20210809 - TIL (데이터베이스) (0) | 2021.08.10 |
TIL - 인터페이스(함수형)와 람다 (0) | 2021.08.04 |
TIL - 개발 환경(클래스패스) (0) | 2021.08.02 |
Comments