Week I Learned

[SQL]연결하기 JOIN_스파르타코딩3주차강의노트

마이초콜릿 2023. 2. 10. 13:31

 

JOIN

테이블은 한 목적에만 맞는 것들로만 모아두는 것이 좋다고 한다.

예를 들면, 회원정보는 회원정보끼리, 체크인은 체크인끼리. 결제정보는 결제정보끼리.

이런 구조가 웹서비스가 동작하는 방식에 있어서 훨씬 더 편하고 간편하다고 함.

이런 각각의 테이블들을 연결 해서 원하는 정보를 조회한다.

 

* 테이블을 붙일 때는 기준이 뭔가 하나 필요하다.

 

Join이란?
두 테이블의 공통된 정보 (key값)를 기준으로 테이블을 연결해서 한 테이블처럼 보는 것
예) user_id 필드를 기준으로 users 테이블과 orders 테이블을 연결해서 한 눈에 보고 싶어요!

엑셀의 vlooup 과 동일하다고 생각하면 된다고 함! 회사에서 하루에 100번은 쓰는 브이룩업...(join이 더 쉽대!!! 흥미진진!)

 

* Join의 종류 : Left Join, Inner Join

Left 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