[SQL] join

* 두 테이블의 공통 정보를 결합하여 하나의 테이블로 체크인

Excel의 vlookup과 동일합니다.

왼쪽 조인 / 내부 조인

Left Join: 왼쪽 테이블을 기준으로 데이터 조인

내부 연결: 교차

– 내부 테이블 조인과 연결하는 코드

select * from checkins c
inner join users u
on c.user_id = u.user_id
select * from enrolleds e 
inner join courses c 
on e.course_id = c.course_id

쿼리가 실행되는 순서

에서 → 가입 → 선택

– 내부 조인으로 통계보기

select c1.course_id, c2. title, count(*) as cnt from checkins c1
inner join courses c2
on c1.course_id = c2.course_id 
group by c1.course_id

~로 데이터를 그룹화하려면 group by !!!를 사용하십시오.

– 내부 조인으로 데이터 정렬

select pu.user_id as ID, u.name as 이름, u.email, pu.point from point_users pu 
inner join users u on pu.user_id = u.user_id 
order by pu.point desc

순서를 사용하여 정렬하세요!!!

쿼리가 실행되는 순서

에서 → 가입 → 위치 → 그룹화 기준 → 선택

– 실습에 참여

(1) 결제 수단별 사용자 포인트 평균값 계산

select o.payment_method, round(avg(pu.point)) as avg_point from point_users pu
inner join orders o
on pu.user_id = o.user_id
group by o.payment_method

(2) 지불하고 성으로 시작하지 않은 사용자 계산

select u.name, count(*) as cnt from enrolleds e
inner join users u 
on e.user_id = u.user_id
where e.is_registered = '0'
group by u.name
order by cnt desc

(3) 주제를 시작하지 않은 사용자 수 계산

select c.course_id, c.title, count(*) as cnt_notstart from courses c 
inner join enrolleds e 
on c.course_id = e.course_id 
where e.is_registered = '0'
group by c.course_id

(4) 웹 개발 및 앱 개발 과정의 주당 등록 수를 세어 봅시다.

select co.title, ch.week, count(*) as cnt from courses co
inner join checkins ch
on co.course_id = ch.course_id 
group by co.title, ch.week
order by co.title, ch.week

(5) 8월 1일 이후 구매고객만 보여주세요~

select c1.title, c2.week, count(*) as cnt from courses c1 
inner join checkins c2
on c1.course_id = c2.course_id 
inner join orders c3
on c2.user_id = c3.user_id 
where c3.created_at >= '2020-08-01'
group by c1.title, c2.week
order by c1.title, c2.week

-결합 링크

어디에 무엇을 붙이느냐의 순서가 중요합니다!

-> 언제 사용하나요?

한편으로는 데이터, 다른 한편으로는

예) 회원이지만 포인트가 없는 사용자 검색(NULL 값 개수 카운트)

강의를 시작하지 않아서 포인트가 없는 분들

select u.name, count(*) as cnt from users u
left join point_users pu 
on u.user_id = pu.user_id
where pu.point_user_id is NULL 'is not NULL 로도 쓸 수 있음'
group by u.name

F. 7월 10일 ~ 7월 19일 사이에 가입한 고객 중 포인트 적립 고객 수, 합계, 비율 확인 (필수 조회!!!!)

select count(pu.point_user_id) as pnt_user_cnt, 
       count(u.user_id) as tot_user_cnt,
       round(count(pu.point_user_id)/count(u.user_id),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개의 질의문을 조합하여 확인하는 UNION

-> Union 문 사용 시 Order by 절은 적용되지 않습니다~!

(
	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
)
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
)

– 숙제

registered_id가 수강한 과정 수는 과정 수가 가장 많은 번호순으로 정렬되며 user_id와 함께 반환됩니다.

select e.enrolled_id, e.user_id, count(*) as max_count from enrolleds e 
inner join enrolleds_detail ed
on e.enrolled_id = ed.enrolled_id 
where ed.done="1"
group by e.enrolled_id 
order by max_count desc