본문 바로가기

학습 내용 정리/sql

SQL Join Union : 스파르타 코딩클럽 엑셀보다 쉬운 SQL 3주차

728x90

이제 레벨 업 기술 배우자. 파이팅.

 

0. Join

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

=

테이블과 테이블을 붙이는 것

기준이 필요함! (key값)

 

1. Left Join

왼쪽에 있는 테이블 기준으로 붙인다.

A에다 B를 붙여라. 없으면 Null 로 보여준다. 
어디에다 뭐를 붙일 건지, 순서가 중요!

SELECT * from users u
left join point_users p
on u.user_id = p.user_id

-  null 빼는 법 !!!

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 u.name

 

2. Inner Join

교집합

SELECT * from users u
inner join point_users p
on u.user_id = p.user_id

 

3. Join 연습

orders 테이블에 users 테이블 연결

SELECT * from orders o 
Inner join users u 
on o.user_id  = u.user_id ;

checkins 테이블에 users 테이블 연결

SELECT * from checkins c 
Inner join users u 
on c.user_id  = u.user_id ;

enrolleds 테이블에 courses 테이블 연결

SELECT * from enrolleds e 
Inner join courses c 
on e.course_id  = c.course_id ;

* SQL 쿼리가 실행되는 순서

from > join > select

어떤 것의 course_id 인지 명확하게 표기

ex) c1.course_id

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

 

포인트 내림차순 정렬

SELECT pu.user_id , pu.point from point_users pu 
inner join users u on pu.user_id = u.user_id 
group by pu.user_id 
order by pu.point  DESC

 

주문 정보에 유저 정보를 연결해 네이버 이메일을 사용하는 유저 중, 성씨별 주문 건 수를 세어 보자
쿼리 실행 순서 : from > join > where > group by > select

SELECT u.name, count(u.name) from orders o 
Inner Join users u on o.user_id = u.user_id 
where o.email like '%@naver.com'
group by u.name 
order by count(u.name)

 

[퀴즈] Join 연습 1

결제 수단별 유저 포인트의 평균값 구해보기

SELECT o.payment_method, round(avg(p.point),1) from orders o 
Inner Join point_users p on o.user_id = p.user_id 
GROUP by o.payment_method 
order by round(avg(p.point),1) desc

 

[퀴즈] Join 연습 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 ;

 

[퀴즈] Join 연습 3

과목 별로 시작하지 않은 유저들을 세어 보기

select e.course_id, title , count(*) as cnt from enrolleds e 
Inner Join courses c  on e.course_id = c.course_id 
where e.is_registered = 0
GROUP by e.course_id
order by cnt DESC ;

 

[퀴즈] Join 연습 4

웹개발, 앱개발 종합반의 week 별 체크인 수를 세어보고 보기 좋게 정리하기 

SELECT c.title, ch.week, count(*) as cnt from courses c
Inner Join checkins ch on c.course_id = ch.course_id 
group by c.title, ch.week
order by c.title, ch.week ;

 

[퀴즈] Join 연습 5

연습 4번에서, 8월 1일 이후에 구매한 고객들만 발라내어 보세요

* inner join 2번, 테이블 3개 잇기

SELECT c.title, ch.week, count(*) as cnt from courses c
Inner Join checkins ch on c.course_id = ch.course_id 
Inner Join orders o on ch.user_id = o.user_id 
where o.created_at >= '2020-08-01' 
group by c.title, ch.week
order by c.title, ch.week ;

 

[복습 요망][퀴즈] Left Join 연습

7월 10일부터 19일에 가입한 고객 중,

포인트를 가진 고객의 숫자, 그리고 전체 숫자, 그리고 비율을 보고 싶어요!

count 는 null 값을 세지 않는다!

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-19'

 

4. Union 

union 에서는 order by 가 안 된다. 합친 것에서 다시 order

(
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
order 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
order by c1.title, c2.week
)

5. 숙제

enrolled_id 별 수강완료(done=1)한 강의 갯수를 세어보고, 완료한 강의 수가 많은 순서대로 정렬해 보기.

user_id도 같이 출력되어야 한다. 

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

6. 소감

항상 마지막에 가까워질수록 어려워지는 것 같다. 그래도 오늘 목표 학습량을 달성해서 기분이 좋다. 코딩 파이팅.