본문 바로가기

카테고리 없음

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

 

join

한 눈에 두개의 테이블을 연결해서 볼 수 있음 (user_id등 특정 칼럼 기반으로)?

그럼 애초에 테이블을 왜 쪼갰지? 

같은 종류나 데이터 목적에 따라 묶어놓는 것이 웹 서비스가 실제로 동작하는 데 있어 

간편하고 맞기 때문에.. (안 그러면 나중에 수정 시에도 문제가 생긴다고) 

 

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

e.g. user_id를 기반으로 두 테이블을 연결~ 

엑셀 vlookup과 동일하다~ 

 

left join / Inner join / outer join도 있는데 쓸 일이 없다. 

 

 

left join

a,b 테이블을 연결하는거면 a테이블에다가 갖다 붙인다는 의미이다.. 흠냐 

null은 회원 중에 포인트가 없는 회원들 

 

inner join은 교집합 (포인트 있는 회원만 결과로 출력함)

 

select * from 테이블명 

left join 테이블명 on 테이블별칭.칼럼명 = 테이블별칭.칼럼명? 

 

 

 

 

실습 

orders 테이블에 users 테이블 연결해보기 

checkins 테이블에 users 테이블 연결해보기 

enrolleds 테이블에 courses 테이블 연결해보기 

 

 

left join은 순서가 중요하다 (어디에 어디를 붙여라)

근데 Inner join은 교집합이라서 순서가 상관없기 때문에 조금 더 쉽다.

 

 

 

 

실행순서

 

from -> join -> select 

가져오는게 젤 나중이요....

 

 

과제1) 

과목별 오늘의 다짐 개수를 세어보아라 

 

checkins 테이블하고 courses 테이블을 연결해서 통계를 내라 

 

 

 

 

 

 

 

 

select u.name, count(*) as cnt from orders o

inner join users u on o.user_id = u.user_id

where u.email like '%naver.com'

group by u.name 

 

쿼리 실행 순서: from -> join -> where -> group by -> select 

기준테이블에서 조인을 하고 이메일조건 걸고 성씨로 그룹해서 최종적으로 성씨별 주문건수 

데이터를 셀렉해서 가져오고 카운트함 

 

 

퀴즈1

결제수단별 유저의 포인트 평균값 구하기 poin_users, orders round 

 

 

inner join을 두 번 걸어가지고 테이블 여러개를 join 걸 수도 있음 

쿼리는 답안이 여러개일 수 있고, 한번에 짜기 보다 에러 떠더 고치면서 글케 보통 한다.. 

 

 

null인거 null 아닌거 

is null 

is not null 

 

 

 

count는 자동으로 null을 빼고 센다 오호 

 

 

union

 

 

합집합인가? 

필드가 다 똑같은데 하나는 7월 데이터, 8월 데이터고 

이어서 보고 싶을때. 테이블의 구성이 그럼 완전 똑같아야 하는거네..

 

( ) union all ( )

union에서는 order by 가 먹지 않는다. (union 안에 있는 경우)

 

 

 

숙제 

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

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

 

 

select e.enrolled_id, e.user_id, count(*) as cnt from enrolleds e

inner join enrolleds_detail ed on e.enrolled_id = ed.enrolled_id

where done = 1

group by e.enrolled_id

order by cnt desc;