개발일지/SQL

3주차 - Join과 Union

FeelsKim 2022. 10. 6. 14:40

1. Join

 

테이블에서 특정 정보를 읽을 때 부득이하게 다른 테이블의 정보와 함께 봐야할 상황이 생길 수 있다.

 

예를들어 포인트 정보가 담긴 테이블과 유저정보가 담긴 테이블이 있다고 할때

포인트가 많은 유저 순으로 보고자 한다면

포인트 정보와 유저정보를 하나로 묶어서 한번에 볼 수가 있다. 

 

inner join 예시

 

Select * From point_users p
Inner Join users u On p.user_id = u.user_id
Order by point Desc

 

두 테이블간의 공통된 필드(user_id)가 있을 경우, 그 필드를 매개로 두 테이블을 이어주는 방식이다.

(이러한 필드를 'Key'라고 한다.)

 

join문에 합치려는 테이블을 입력한 뒤, On을 통해 두 테이블의 key 테이블(user_id)을 =로 이어주면 된다.

 

조인이 기본적으로 집합개념이라 종류가 여러가지가 있는걸로 알고있다.

 

* 두 테이블 A, B가 있다고 할때

1. Inner join : A와 B테이블의 교집합(A ∩ B). 
-- 두 테이블에서 공통된 데이터 항목만을 조인하여 출력

2. Left join : A테이블을 기준으로 교집합 + 차집합( (A ∩ B) ∪ (A - B) ). 
-- A에 있는 데이터 항목을 기준으로 조인하여 출력 (있으면 있는대로, 없으면 null로 표시)

3. Right join : B테이블을 기준으로 교집합 + 차집합( (B ∩ A) ∪ (B - A) ). 
-- B에 있는 데이터 항목을 기준으로 조인하여 출력 (있으면 있는대로, 없으면 null로 표시)

4. Full outer join : A와 B테이블의 합집합(A ∪ B).
-- 공통된 테이터 항목과 한쪽에만 존재하는 데이터 항목 모두 출력

 

 

일단 가장 많이 사용하는게 inner join이라고 한다.

left join이나 right join의 경우 합치려는 테이블의 순서('어떤 테이블에 어떤 테이블을 붙일지')에 따라 출력값이 달라지기 때문에 이 부분을 주의해야 한다.

 

inner join의 특징은 교집합과 같은 개념으로, 공통된 필드값(키값)에 한해서만 결과가 나온다는 점이다.

위 예시에서 point_user 테이블에 있는 user_id와 users 테이블에 있는 user_id의 속한 값들이 완벽히 일치하지는 않을 때,

공통된 user_id만 추려서 조인된다. 

 

그리고 이렇게 합쳐진 테이블에 또다른 테이블을 이어주는 것도 가능하다. 

join으로 합쳐진 테이블에 또다시 join을 걸어, 필요에 따라 여러 테이블들을 묶어서 볼 수 있다.

다만 이럴땐 합치려는 테이블과 key 테이블을 헷갈리지 않도록..

 

join을 잘 쓰려면 일단 '무엇을 보려고 하는지' 를 잘 파악하는게 가장 중요한것 같다. 

 

2. Union, Union all

 

union은 똑같은 필드로 이뤄진 두 테이블을 합칠 때 사용한다.

값만 다른 똑같은 테이블을 합치는것이기 때문에 그대로 밑에 붙는다.

 

다만 union을 사용할 땐 중복값을 제외하고 합쳐지는 반면,

union all은 중복값을 포함하여 그대로 합쳐진다.

 

union 사용시 유의할 점은 기존에 order by가 풀려서 정렬을 다시해야 한다는 점이다.

이 부분은 서브쿼리를 통해 해결할 수 있다.