걷기 시작한 Coding Novice

SQL

Join 연습해보기 2 (feat. Inner Join)

Spell 2022. 5. 23. 19:30

이제까지 배웠던 문법들과 함께 Join을 더 연습해보자.

 


1. checkins 테이블에 courses 테이블 연결해서 통계치 내보기

'오늘의 다짐' 정보에 과목 정보를 연결해 과목별 '오늘의 다짐' 개수 세기

두개의 테이블을 역시나 확인해 봐야겠지?

select *
from checkins ch

 

select *
from courses c

 

course_id를 공유하고 있다. 이를 key로 연결시켜주자.

select *
from checkins ch
inner join courses c
on ch.course_id = c.course_id

 

과목별 '오늘의 다짐'의 개수를 세줘야 하니까, 일단 과목별로 묶어볼까?

select *
from checkins ch
inner join courses c
on ch.course_id = c.course_id
group by course_id

음?.. 에러가 떳다. group by에서 문제가 발생한거 같은데.. course_id는 양쪽 모두의 테이블에서 존재하는데 어느 쪽 테이블의 course_id인지 명확하게 애기해주지 않아서 벌어진 문제 같다. 하나를 지정해주자.

select *
from checkins ch
inner join courses c
on ch.course_id = c.course_id
group by ch.course_id

 

개수를 세주기 위한 count를 사용하자.

select ch.course_id, count(*) as cnt
from checkins ch
inner join courses c
on ch.course_id = c.course_id
group by ch.course_id

 

한번 더 나아가서 titile도 함께 보게 수정하자. 저 course_id가 무엇인지 알아보기 어려우니까. 그러면 다음과 같이 입력해보면 되겠다.

select ch.course_id, c.title, count(*) as cnt
from checkins ch
inner join courses c
on ch.course_id = c.course_id
group by ch.course_id

짜잔~

 


2. point_users 테이블에 users 테이블 연결해서 순서대로 정렬해보기

유저의 포인트 정보가 담긴 테이블에 유저 정보를 연결해서, 많은 포인트를 얻은 순서대로 유저의 데이터를 뽑기

테이블 확인!

select *
from point_users pu

 

select *
from users u

 

user_id를 공유하고 있꼬, point_users에 users를 붙인다.

select *
from point_users pu
inner join users u 
on pu.user_id = u.user_id

 

많은 포인트를 얻은 순서대로 유저의 데이터를 뽑아야 하니까, 내림차순 정렬이 필요하다.

select *
from point_users pu
inner join users u 
on pu.user_id = u.user_id 
order by pu.point desc

 

보기가 좀 힘들다. 깔끔하게 보기위해서 다듬어야겠다. 유저의 데이터니까 user_id, point, name, email 이런식으로 보는게 편하겠지? 어느 테이블의 어느 필드인지 잘 적어줘야 한다.

select pu.user_id, u.name, u.email, pu.point
from point_users pu
inner join users u 
on pu.user_id = u.user_id 
order by pu.point desc

 

 


orders 테이블에 users 테이블 연결해서 통계치 내보기

주문 정보에 유저 정보를 연결해 네이버 이메일을 사용하는 유저 중, 성씨별 주문건수를 세어보기

테이블 확인~

select *
from orders o

 

select *
from users u

 

user_id로 연결시켜주고

select *
from orders o
inner join users u 
on o.user_id = u.user_id

 

성씨별로 묶어주는데, naver 이메일을 사용하는 유저만 추려야 한다.

select *
from orders o
inner join users u 
on o.user_id = u.user_id
where u.email like '%naver.com'
group by u.name

 

보기 편하게 다듬어주면서, count를 사용해서 개수를 세어준다. (별칭은 덤~)

select u.name, count(u.name) 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

 


또 짚고 넘어갈 마지막 예시로 SQL 쿼리가 실행되는 순서!

select u.name, count(u.name) 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​

1. from orders o
orders 테이블 데이터 전체를 가져오고 o라는 별칭을 준다

2. inner join users u

on o.user_id = u.user_id

users 테이블을 orders 테이블에 붙이는데(이때 users테이블은 u라는 별칭을 부여한다), orders테이블의 user_id필드와 users테이블의 user_id필드가 같으니 key로써 서로를 붙인다.

3. where u.email like '%naver.com'

users 테이블 email 필드값이 naver.com으로 끝나는 값만 가져오고

4. group by u.name

users 테이블의 name값이 같은 값들을 묶은 다음

5. select u.name, count(u.name) as cnt

users 테이블의 name필드와 name 필드를 기준으로 묶여진 개수를 세어서 뽑아달라!

Join의 실행 순서는 항상 from 과 붙어 다닌다고 생각하면 편하다!