[SQL]연결하기 JOIN_스파르타코딩3주차강의노트
JOIN
테이블은 한 목적에만 맞는 것들로만 모아두는 것이 좋다고 한다.
예를 들면, 회원정보는 회원정보끼리, 체크인은 체크인끼리. 결제정보는 결제정보끼리.
이런 구조가 웹서비스가 동작하는 방식에 있어서 훨씬 더 편하고 간편하다고 함.
이런 각각의 테이블들을 연결 해서 원하는 정보를 조회한다.
* 테이블을 붙일 때는 기준이 뭔가 하나 필요하다.
Join이란?
두 테이블의 공통된 정보 (key값)를 기준으로 테이블을 연결해서 한 테이블처럼 보는 것
예) user_id 필드를 기준으로 users 테이블과 orders 테이블을 연결해서 한 눈에 보고 싶어요!
엑셀의 vlooup 과 동일하다고 생각하면 된다고 함! 회사에서 하루에 100번은 쓰는 브이룩업...(join이 더 쉽대!!! 흥미진진!)
* Join의 종류 : Left Join, Inner Join
<Left Join 실습>
users 테이블의 user_id와
point_users 테이블의 user_id를 기준으로
user 테이블을 베이스로 두고 그 옆에 point_users 의 정보를 붙임.
어떤 데이터는 모든 필드가 채워져있지만, 어떤 데이터는 비어있는 필드가 있다.
꽉 찬 데이터: 해당 데이터의 user_id 필드값이 point_users 테이블에 존재해서 연결한 경우
ql어있는 데이터: 해당 데이터의 user_id 필드값이 point_users 테이블에 존재하지 않는 경우
Left Join 은 누구에게 누구를 붙이냐에 따라서 결과가 달라지기 떄문에 순서가 매우 중요하다.
(A에게 B를 붙일지 B에게 A를 붙일지!)
select * from users u
left join point_users p
on u.user_id = p.user_id;
select * from users u
inner join point_users p
on u.user_id = p.user_id;
쿼리를 실행하면 포인트가 있는 회원정보만 나오게 된다. 즉 '교집합' 정보가 추출됨.
<Inner Join 실습>
쿼리가 실행되는 순서 : from → join → select
<배웠던 문법과 Join 연습>
1. checkins 테이블에 courses 테이블 연결해서 통계치 내보기
-> '오늘의 다짐' 정보에 과목 정보를 연결해 과목별 '오늘의 다짐' 갯수를 세어보자!
select co.title, count(*) as checkin_count from checkins ci
inner join courses co
on ci.course_id = co.course_id
group by co.title
2. point_users 테이블에 users 테이블 연결해서 순서대로 정렬해보기
->유저의 포인트 정보가 담긴 테이블에 유저 정보를 연결해서, 많은 포인트를 얻은 순서대로 유저의 데이터를 뽑아보자!
select * from point_users p
inner join users u
on p.user_id = u.user_id
order by p.point desc
3. orders 테이블에 users 테이블 연결해서 통계치 내보기
->주문 정보에 유저 정보를 연결해 네이버 이메일을 사용하는 유저 중, 성씨별 주문건수를 세어보자!
select u.name, count(u.name) as count_name 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