본문 바로가기

Data/SQL

SQL 고급 : 3개 이상의 테이블을 JOIN 하기

 

현실에서 데이터 분석을 하다 보면 경우에 따라서 3~4개의 테이블을 조인해야 하는 상황이 생길 수 있습니다. 하지만 JOIN과 관련된 기본 문법을 익히거나 일반적인 SQL 문제 풀이에서 3~4개 테이블을 조인해야 하는 경우를 찾기가 쉽지 않은데요. 다행스럽게도 최근 새롭게 풀어본 SQL 문제를 통해 어떻게 3개 이상의 테이블을 JOIN할 수 있는지 보여드리려고 합니다.

 

역대 올림픽 경기와 관련된 데이터가 들어가 있는 테이블을 가지고 문제를 풀어볼텐데요. 우리가 해결해야 할 문제는 복수 국적으로 메달을 수상한 선수를 찾는 문제입니다. 예를 들면 쇼트트랙의 안현수(빅토르 안) 선수와 같이 올림픽에서 한국 국적과 러시아 국적으로 모두 메달을 딴 선수를 찾아야 한다는 것이죠. 문제 내용에 대해서는 저작권 이슈가 있기 때문에 상세한 문제 설명은 아래 링크를 클릭해서 확인해보시기 바랍니다. 

 

 

solvesql

© Copyright 2021-2022 solvesql.com

solvesql.com

 

 

문제를 풀기 위해서 우리가 고려해야할 사항은 다음과 같습니다. 

1. 2000년 이후의 메달 수상 기록만 고려
2. 메달을 수상한 올림픽 참가 선수 중 2개 이상의 국적으로 메달을 수상한 기록이 있는 선수의 이름을 조회
3. 조회된 선수의 이름은 오름차순으로 정렬되어 있어야 합니다

 

첫 번째로 2000년 이후의 메달 수상 기록만 고려 해야합니다. 올림픽이 개최된 연도, 시즌, 도시명 정보를 가지고 있는 games 테이블에서 2000년 이후 데이터만 활용해야 합니다.

 

두 번째로는 2개 이상의 국적으로 메달을 수상한 기록이 있는 선수 이름을 조회 하려면 어떻게 해야 할까요? 선수들의 올림픽 참가 정보가 담겨있는 records 테이블을 보시면 medal, team_id 컬럼이 있습니다. 즉, medal 컬럼이 null 값이 아닐 경우, 메달을 획득했다는 말이 되겠죠. 또한, athlete_id나 이름 정보로 GROUP BY를 해주었을 때 조회되는 team_id가 1개가 아니라 2개 이상이라면 복수 국적으로 출전했다고 이해할 수 있을 것입니다.

 

세 번째는 매우 간단합니다. 조회된 선수의 이름이 오름차순으로 정렬되어 있어야 한다고 했으니 ORDER BY를 오름차순으로 지정해주기만 하면 끝입니다.

 

마지막으로 오늘 주제이기도 한 3가지 테이블 이상을 JOIN 하는 것에 대해 설명을 드리면요. 사실 어려운 내용은 전혀 아닙니다. 이 문제는 데이터 조회에 필요한 관련 정보들이 athletes, games, records, teams 등 여러 테이블로 쪼개져 있는 상황입니다. 그렇기 때문에 우리는 해당 정보를 가져오기 위해 아래와 같이 순서대로 JOIN을 걸어줄 수 있겠습니다.

 

SELECT a.name
FROM records r LEFT JOIN athletes a ON r.athlete_id = a.id
               LEFT JOIN games g ON r.game_id = g.id  
               LEFT JOIN teams t ON r.team_id = t.id
WHERE medal IS NOT NULL AND g.year >= 2000
GROUP BY athlete_id
HAVING COUNT(distinct team) > 1
ORDER BY a.name

 

여러 개의 테이블을 JOIN 할 때 종종 헷갈리는 부분은 바로 콤마(,)를 매번 넣어주어야 하는지 여부입니다. 하지만 보시는 것 처럼 여러 테이블을 JOIN할 때는 콤바(,)를 넣어주지 않으니 이 부분이 헷갈리는 일이 없으시길 바라겠습니다.

 

 

작성된 내용 중 잘못된 부분이나 궁금한 사항이 있다면 언제든지 피드백 부탁 드립니다.

 

감사합니다.