DataBase/Mysql

[SQL] 테이블 연결 , Join 과 Union

민돌v 2022. 1. 6. 16:48

1) Join 이란?

두 테이블의 공통된 정보(Key값)을 기준으로 테이블을 연결해서 한 테이블처럼 보는 것

ex) user_id 필드를 기준으로 users 테이블과 orders 테이블을 연결해서 한 눈에 보고 싶다!

👉 이럴 때를 대비해서 무언가 연결된 정보가 있을 때, user_id 처럼 동일한 이름과 정보가 담긴 필드를 두 테이블에 똑같이 담아놓는데 이런 필드를 두 테이블을 연결시켜주는 열쇠라는 의미로 'key'라고 부른다.

예시

 


2) Join의 종류: Left Join, Inner Join

1. Lefg Join

Left join은 A테이블에 B테이블이 매핑되는 부분이 붙혀진, 모든 A테이블의 데이터가 조회됩니다.

Left join

 

 

2. Ineer join

ineer join은 B테이블과 매핑되는 A테이블의 데이터(교집합)만 조회됩니다.

 

 

👉 연결의 기준이 되고싶은 테이블을 from 절에, 기준이 되는 테이블에 붙이고 싶은 테이블을 Join 절에 위치해 놓습니다.


 

3) inner join 사용법

join 'table' on 결합 조건

select u.name, count(u.name) as count_name from orders o
inner join users u
on o.user_id = u.user_id 
where u.email like '%naver.com'
group by u.name

👉 위 쿼리가 실행되는 순서: from → join → where → group by → select


4) Left join 사용법

 

left join을 주로 이용할 때는, 조인하는 테이블의 데이터를 가지고 있거나, 없는 데이터를 판단할 때 주로 이용합니다

select name, count(*) from users u
left join point_users pu on u.user_id = pu.user_id
where pu.point_user_id is not NULL
group by name

5) Union 결과물 합치기

조회하고자 하는 조건이 서로다른 쿼리문을 함께 보고싶었을 때 Union을 사용하면 

Select를 두번 할 필요없이 사용할 수 있다!

(
	select '7월' as month, c.title, c2.week, count(*) as cnt from checkins c2
	inner join courses c on c2.course_id = c.course_id
	inner join orders o on o.user_id = c2.user_id
	where o.created_at < '2020-08-01'
	group by c2.course_id, c2.week
  order by c2.course_id, c2.week
)
union all
(
	select '8월' as month, c.title, c2.week, count(*) as cnt from checkins c2
	inner join courses c on c2.course_id = c.course_id
	inner join orders o on o.user_id = c2.user_id
	where o.created_at > '2020-08-01'
	group by c2.course_id, c2.week
  order by c2.course_id, c2.week
)

👉 유니온을 사용하기 위해서는 한 가지 조건이 있는데, 두 테이블의 필드명이 같아야 한다.  (결과를 합치는 것이기 때문에)

 

Union을 사용하면 내부 정렬이 먹히지 않는데, order by는 모든 결과가 나온 후 정렬을 진행하기 때문이다.

이때 유용한 방법이 서브쿼리이다! (다음게시물에 포스팅레츠고)