🪢 Join
- 여러 정보를 한 눈에 보고 싶을 때 사용한다.
- 두 테이블의 공통된 정보(key값) 기준으로 테이블을 연결해서 한 테이블처럼 보는 것
- point_user 테이블과 users 테이블을 연결해줘. -> 공통된 키값은 'user_id'
select * from point_users
left join users
on point_users.user_id = users.user_id
1) Left Join
- 왼쪽 테이블을 중심으로 오른쪽의 테이블을 연결한다.
- 어떤 데이터는 모든 필드가 채워져있지만, 어떤 데이터는 비어있는 필드가 있다.
- ex) 회원이지만 수강 등록 또는 시작하지 않아 포인트가 null 값일때
https://www.w3schools.com/sql/sql_join_left.asp
- users 테이블과 point_users 테이블 left join 해보기
🙋♀️ 실행되는 순서
from -> join -> select
1) from users: users 테이블 데이터 전체를 가져온다.
2) inner join point_users p on u.user_id = p.user_id: users 테이블 기준으로 point_users 테이블을 연결한다.
3) select *
select * from users u
left join point_users pu on u.user_id = pu.user_id
🙋♀️ u, pu??
- users 테이블과 point_users 테이블의 별칭
- 포인트가 없는 유저들의 데이터들만 보여줘. is NULL
select * from users u
left join point_users pu on u.user_id = pu.user_id
where pu.point_user_id is NULL
group by name
- 포인트가 지급된 유저들의 데이터들만 보여줘. is not NULL
select * 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
- 7월 10일 ~ 7월 19일 가입한 고객 중, 포인트를 가진 고객의 숫자, 비율 가져와줘.
select count(pu.point_user_id) as pnt_user_cnt,
round(count(pu.point_user_id)/count(*), 2) as ratio
from users u
left join point_users pu on u.user_id = pu.user_id
where u.created_at between '2020-07-10' and '2020-07-20'
2) Inner join
- 두 테이블의 교집합
https://www.w3schools.com/sql/sql_join_inner.asp
- users 테이블과 point_users 테이블 inner join 해보기
🙋♀️ 실행되는 순서
from -> join -> select
1) from users: users 테이블 데이터 전체를 가져온다.
2) inner join point_users p on u.user_id = p.user_id: users 테이블에 있는 user_id 키값과
point_users 테이블에 있는 user_id 키값끼리 연결해준다. 이 때 교집합의 특성대로 공통적인 부분만 연결한다.
3) select *
select * from users u
inner join point_users p on u.user_id = p.user_id;
🩹 Union
- select 2번의 효과
(
select '7월' as month, c1.title, c2.week, count(*) as cnt from courses c1
inner join checkins c2 on c1.course_id = c2.course_id
inner join orders o on c2.user_id = o.user_id
where o.created_at >= '2020-08-01'
group by c1.title, c2.week
)
union all
(
select '8월' as month, c1.title, c2.week, count(*) as cnt from courses c1
inner join checkins c2 on c1.course_id = c2.course_id
inner join orders o on c2.user_id = o.user_id
where o.created_at >= '2020-08-01'
group by c1.title, c2.week
)