스파르타 코딩클럽 SQL 3주차 강의 '핵심' 노트정리
1. Join ~ on -
: 공통된 정보(key값)를 이용해서 두 테이블을 한 테이블처럼 잇는 것
▶ select * from 테이블1
join 테이블2(조인하고 싶은 테이블) on 테이블1. key필드명 = 테이블2.key필드명
★쿼리문 읽는 순서★
1) from 테이블1 : 테이블1 전체 데이터를 가져온다.
2) join 테이블2 : 테이블2를 테이블1에 붙일건데
3) on 테이블1.key필드명 = 테이블2.key필드명 : 테이블1의 key필드와 같은 key필드를 가지는 테이블2를 붙인다.
※ 이 때 테이블명을 꼭 적어줘야 이 필드가 어떤 테이블에서 온 필드인지 구분 가능. 대신 약칭으로 적어줘도 됨.
4) select * : 붙여진 모든 데이터를 출력한다.
2. Join의 종류 (Left Join, Inner Join)
* Left join
: A테이블에 B테이블을 붙이는 것.
: 어디에 → 무엇을 붙일건지 순서가 중요함.
: 두 테이블을 Left Join 했을 때 어떤 데이터는 모든 필드가 채워져있지만,
어떤 데이터는 해당 필드가 비어있을 수 있음.(NULL)
ex. users 테이블과 point_users 테이블의 공통된 값인 user_id 필드로 두 테이블을 Left Join 하는 경우
select * from users u
left join point_users pu on u.user_id = pu.user_id
: user_id가 users테이블과 point_users테이블의 공통된 값(key값)
: user_id를 기준으로 users테이블에 point_users 테이블을 가져다 붙임.
: user_id마다 point_users테이블에서 각각의 포인트 정보가 출력되는데
아직 활동을 시작하지 않은 user_id들은 포인트가 존재하지 않기 때문에 포인트 관련 필드가 다 비어있음.(NULL)
* Inner join
: A테이블과 B테이블의 공통된 데이터만 출력
ex. users 테이블과 point_users 테이블의 공통된 값인 user_id 필드로 두 테이블을 Inner Join 하는 경우
select * from users u
inner join point_users pu on u.user_id = pu.user_id
: user_id가 users테이블과 point_users테이블의 공통된 값(key값)
: user_id를 기준으로 users테이블과 point_users 테이블의 공통된 값이 출력됨.
: 그래서 두 테이블을 Inner Join 했을 때는 비어있는 데이터가 없음.
3. 연습문제
문제1) 웹개발, 앱개발 종합반의 week 별 체크인 수 세어보고, 보기좋게 정리하기
(courses 테이블과 checkins 테이블 참고)
1) courses 테이블과 checkins 테이블에 각각 어떤 필드들이 있는지 Select쿼리문으로 출력해보기
: courses_id가 두 테이블의 공통된 값이면서
웹개발, 앱개발 종합반(courses)별 체크인 수를 세는 것이 목적이니까 key값이 됨.
2) courses_id를 기준으로 Inner Join 함.
select * from courses c1
inner join checkins c2 on c1.course_id = c2.course_id
↑ 여기서 courses 옆의 c1과 checkins 옆의 c2가 각 테이블의 약칭.
한 번 이렇게 지정해주면 그 다음부터는 그 테이블을 약칭으로 적어줘도 됨.
3) 웹개발, 종합반 별 + week별 체크인 수를 세어줘야 하기 때문에
c1.title 과 c2.week 로 group by해줌.
그 뒤에 Selec쿼리문으로 group by한 항목들과 count(*)를 출력해줌.
※ Select문에 group by한 항목들 적을 때도 꼭 약칭 같이 써줘야 함.
이 필드가 어떤 테이블에서 가지고 온 필드인지 지정해주지 않으면 오류 날 수 있음!
select c1.title, c2.week, count(*) from courses c1
inner join checkins c2 on c1.course_id = c2.course_id
group by c1.title, c2.week
↑ 두 번째 슬라이드 결과를 보면 앱개발, 웹개발 title과 week가 혼잡하게 섞여있음.
4) order by를 이용해서 title과 week를 정렬해주면 끝!
select c1.title, c2.week, count(*) from courses c1
inner join checkins c2 on c1.course_id = c2.course_id
group by c1.title, c2.week
order by c1.title, c2.week
문제2) 문제1에서 8월1일 이후에 구매한 고객들만 발라내보기.
(courses 테이블에 checkins 테이블을 붙이고, checkins 테이블에 orders 테이블을 한 번 더 붙이기)
1) Select문으로 orders 테이블 출력해서 checkins 테이블과의 공통된 값(key값)찾아보기
2) checkins테이블과 orders 테이블을 users_id 기준으로 Inner Join 함.
select * 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
3) [ 8월 1일 이후에 구매한 ] 고객들을 세어줘야 하기 때문에 where절로 조건 적어줌.
select * 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'
4) 마지막으로 문제1번에서 했던 group by와 order by 적용해주고, Select 문에 적어주면 끝!
select c1.title, c2.week, count(*) 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. Union
: Select를 두 번 할 게 아니라 한 번에 모아서 보고싶은 경우에 사용.
단, 조건이 있음. 노란색과 파란색 박스의 필드명이 같아야 함.
방금 전 문제의 쿼리문을 이용해서 아래 ↓ 결과 만들기
7월과 8월 데이터 쿼리문을 union all로 이어주기
(
select '7월' as month, c.title, c2.week, count(*) as cnt from checkins c2
inner join courses c on c2.course_id = c.course_id
inner join orders o on o.user_id = c2.user_id
where o.created_at < '2020-08-01'
group by c2.course_id, c2.week
order by c2.course_id, c2.week
)
union all
(
select '8월' as month, c.title, c2.week, count(*) as cnt from checkins c2
inner join courses c on c2.course_id = c.course_id
inner join orders o on o.user_id = c2.user_id
where o.created_at > '2020-08-01'
group by c2.course_id, c2.week
order by c2.course_id, c2.week
)
'데이터분석 과정 > SQL' 카테고리의 다른 글
SQL | Group By절과 집계 함수는 한 세트 | 집계 함수 사용 시 주의 사항 (1) | 2024.01.05 |
---|---|
SQL | SUM함수, COUNT함수 사용법 정리 (1) | 2024.01.05 |
SQL 1주차 강의 노트정리 [국비지원_스파르타 코딩클럽] (0) | 2024.01.03 |
SQL 4주차 강의 노트정리[국비지원_스파르타 코딩클럽] (0) | 2023.01.19 |
SQL 2주차 강의 노트정리 [국비지원_스파르타 코딩클럽] (0) | 2023.01.17 |
댓글