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;