이번 주의 배울 것 : Join
테이블과 테이블을 붙이는 것. 실무에서 무조건 쓰인다.
ex.
오늘의 다짐 이벤트 당첨자를 선정하여 스타벅스 기프티콘을 지급해야 한다.
'오늘의 다짐 이벤트' : 오늘의 다짐을 남겨준 10명 추첨해서 기프티콘 지급하는 이벤트
그런데 checkins 테이블에는 user_id만 있고 이름이 없다!
users 테이블에 유저의 이름과 user_id가 있다.
* 테이블을 붙일 때는 기준이 필요하다.
Join이란?
두 테이블의 공통된 정보(key 값)를 기준으로 테이블을 연결해서 한 테이블처럼 보는 것
ex. user_id 필드를 기준으로 users 테이블과 orders 테이블을 연결해서 한 눈에 보고 싶다.
엑셀의 vlookup과 동일하다. 이거보다 더 쉽다(?)
Join의 종류 : Left Join, Inner Join
Left Join : 왼쪽에 있는 테이블을 기준으로 오른쪽에 붙인다.
SELECT * from users u
left join point_users pu on u.user_id = pu.user_id
// users 테이블을 기준으로 user_id를 키값으로 하여 point_users을 오른쪽에 붙인다.
// 별칭 꼭 이용하여야 한다.
// NULL : 매칭안되는 사람들도 있겠죠!? 강의를 아직 시작하지 않은 사람은 포인트가 0!
Inner Join : 매칭이 되는 부분만 가져온다! 교집합만 가져온다!
SELECT * from users u
inner join point_users pu on u.user_id = pu.user_id
// ↑ 이 부분만 inner로 바꿔주면 된다!
Practice
일단 inner join으로 연습! 왜? left join은 기준이 되는 테이블에다가 다른 테이블을 붙이는데 매칭 안되는 부분은 null로 보여주기 때문.
inner join은 기본적으로 교집합이라 순서가 필요없는데 left join은 순서를 생각해줘야 하기 때문에! 좀 더 어렵다.
* enrolleds 테이블에 courses 테이블 연결해보기
select * from enrolleds e
inner join courses c on e.course_id = c.course_id
//쿼리가 실행되는 순서 : from >> join >> select
배웠던 문법을 join과 같이 해보기!
* order 테이블에 users 테이블 연결해서 통계치 내보기
// 네이버 이메일을 사용하는 유저 중, 성씨별 주문건수를 세어보자!
select u.name, COUNT(*) from orders o
inner join users u on o.user_id = u.user_id
WHERE u.email LIKE '%naver.com'
group by u.name
order by u.name
// 쿼리 실행 순서 : from >> join >> where >> group by >> order by >> select
Left Join
Left Join 어디에 뭐를 붙일건지가 중요
- 한쪽에는 있는데 한쪽에는 없는 것을 가지고 통계를 내고 싶을 때!
SELECT u.name , COUNT(*) as cnt from users u
left join point_users pu on pu.user_id = u.user_id
where pu.point_user_id is NULL
group by u.name
// 포인트가 없는 사람들을 추출할 때
// 포인트가 있는 사람들을 추출하려면? where pu.point_user_id is not NULL
// NULL은 대문자로 써주세요.
UNION
UNION에 대해 배워보자.
(
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
)
order by가 원래 안에 있었는데 union을 해주면 order이 다 깨지게 됨. 다시 order을 해줘야 한다. >> 다음 주차에 배움.
'STUDY > SQL' 카테고리의 다른 글
스파르타 코딩클럽 <엑셀보다 쉬운 SQL> 4주차 문법 정리 (0) | 2023.05.13 |
---|---|
스파르타 코딩클럽 <엑셀보다 쉬운 SQL> 2주차 문법 정리 (0) | 2023.05.13 |
스파르타 코딩클럽 <엑셀보다 쉬운 SQL> 1주차 문법 정리 (0) | 2023.05.13 |