* 두 테이블의 공통 정보를 결합하여 하나의 테이블로 체크인
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
