이제 레벨 업 기술 배우자. 파이팅.
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. 소감
항상 마지막에 가까워질수록 어려워지는 것 같다. 그래도 오늘 목표 학습량을 달성해서 기분이 좋다. 코딩 파이팅.
'학습 내용 정리 > sql' 카테고리의 다른 글
엑셀보다 쉬운 SQL 완주 (1) | 2023.05.04 |
---|---|
유용한 SQL 문법 : 스파르타 코딩클럽 엑셀보다 쉬운 SQL 4주차 (1) | 2023.05.02 |
SQL Subquery With : 스파르타 코딩클럽 엑셀보다 쉬운 SQL 4주차 (3) | 2023.05.02 |
SQL Groupby Orderby : 스파르타 코딩클럽 엑셀보다 쉬운 SQL 2주차 (1) | 2023.05.01 |
SQL 쿼리문 기초 : 스파르타 코딩클럽 엑셀보다 쉬운 SQL 1주차 (1) | 2023.05.01 |