티스토리 뷰
조인이란?
sql 조인은 두 개 이상의 테이블들을 공통 필드를 가지고 통합하는 것으로
스타 스키마로 구성된 테이블들로 분산되어 있던 정보를 통합하는데 사용된다!
join의 결과로 양쪽의 필드를 모두 가진 새로운 테이블이 만들어지게 되며,
조인의 방식에 따라 어떤 레코드들이 선택되는지, 어떤 필드들이 채워지는지가 결정된다.
JOIN 문법!
SELECT A.*, B.*
FROM raw_dat.table1 A
___ JOIN raw_data.table2 B ON A.key1 = B.key1 and A.key2 = B.key2
WHERE A.ts>='2019-01-01';
그렇다면 JOIN시에 고려할 점은 없을까?
1. 중복 레코드가 없고 Primary Key의 uniqueness가 보장됨을 체크해야한다.
2. 조인하는 테이블들간의 관계를 명확하게 정의해두어야, 나중에 헷갈리지 않는다.
- One to one
- One to many
- Many to one
- Many to many
3. 어느 테이블을 베이스로 잡을지(From에 사용할지) 결정해야 한다.
JOIN의 종류
create table vital (
user_id int not null,
vital_id int primary key,
date timestamp,
weight int not null
);
create table alert (
alert_id int primary key,
vital_id int,
alert_type varchar(32),
date timestamp,
user_id int
);
1. INNER JOIN
양쪽에 공통적으로 매칭이되는 레코드들만 머지가 되어 리턴이 된다.
➡️양쪽 테이블의 필드가 모두 채워진 상태로 리턴된다.
select * from prod.vital v
join prod.alert a on v.vital_id = a.vital_id;
2. LEFT JOIN
기본적으로 왼쪽에 있는거 다 킾하고, 오른쪽과 매칭이 되는거 끌고간다.
➡️왼쪽 테이블의 모든 레코드들을 리턴하고, 오른쪽 테이블의 필드는 왼쪽 레코드와 매칭되는 경우에만 채워진 상태로 리턴된다.
select * from prod.vital v
left join prod.alert a on v.vital_id = a.vital_id;
3. RIGHT JOIN
기본적으로 오른쪽에 있는거 다 keep하고, 왼쪽과 매칭이 되는 것을 끌고간다.
select * from prod.vital v
right join prod.alert a on v.vital_id = a.vital_id;
4. FULL OUTER JOIN
왼쪽 테이블과 오른쪽 테이블의 모든 레코드들을 리턴한다.
매칭되는 경우에만 양쪽 테이블들의 모든 필드들이 채워진 상태로 리턴된다.
👀 MySQL은 이를 지원하지 않아 LEFT JOIN과 RIGHT JOIN을 UNION하는 것으로 이를 대신할 수 있다.
select * from prod.vital v
left join prod.alert a on v.vital_id = a.vital_id
union all
select * from prod.vital v
right join prod.alert a on v.vital_id = a.vital_id;
➕UNION vs UNION ALL
UNION은 양쪽에서 중복되는 레코드를 처리해주지만,
UNION ALL은 양쪽에서 중복되는 레코드를 리턴해도 터치를 안한다.
5. SELF JOIN
같은 테이블끼리 조인을 하는 것이다.
동일한 테이블을 alias를 달리해서 자기 자신과 조인한다.
👇아래 링크 참고
https://jerecord.tistory.com/178
select * from prod.vital v1
join prod.vital v2 on v1.vital_id = v2.vital_id;
6. CROSS JOIN
왼쪽 테이블과 오른쪽 테이블의 모든 레코드들의 조합을 리턴한다.
➡️조합해서 만들 수 있는 모든 레코드를 리턴하게 된다.
select * from prod.vital v
cross join prod.alert a;
'백엔드 > 데이터베이스' 카테고리의 다른 글
[데이터베이스] Explain SQL, Index (0) | 2023.10.06 |
---|---|
[데이터베이스] Self Join은 어디에 사용될까? (1) | 2023.10.05 |