티스토리 뷰

조인이란?

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

 

[데이터베이스] Self Join은 어디에 사용될까?

Join에 관해 학습하던 도중, 조인의 다양한 종류 중 Self Join을 마주하게 되었습니다👀 같은 테이블끼리 조인한다는 점에서 🤨엥? 왜지?? 싶었고, 어떤 상황에서 유용하게 사용되는지 찾아보았습

jerecord.tistory.com

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;