현실에서 데이터 분석을 하다 보면 경우에 따라서 3~4개의 테이블을 조인해야 하는 상황이 생길 수 있습니다. 하지만 JOIN과 관련된 기본 문법을 익히거나 일반적인 SQL 문제 풀이에서 3~4개 테이블을 조인해야 하는 경우를 찾기가 쉽지 않은데요. 다행스럽게도 최근 새롭게 풀어본 SQL 문제를 통해 어떻게 3개 이상의 테이블을 JOIN할 수 있는지 보여드리려고 합니다.
역대 올림픽 경기와 관련된 데이터가 들어가 있는 테이블을 가지고 문제를 풀어볼텐데요. 우리가 해결해야 할 문제는 복수 국적으로 메달을 수상한 선수를 찾는 문제입니다. 예를 들면 쇼트트랙의 안현수(빅토르 안) 선수와 같이 올림픽에서 한국 국적과 러시아 국적으로 모두 메달을 딴 선수를 찾아야 한다는 것이죠. 문제 내용에 대해서는 저작권 이슈가 있기 때문에 상세한 문제 설명은 아래 링크를 클릭해서 확인해보시기 바랍니다.
문제를 풀기 위해서 우리가 고려해야할 사항은 다음과 같습니다.
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할 때는 콤바(,)를 넣어주지 않으니 이 부분이 헷갈리는 일이 없으시길 바라겠습니다.
작성된 내용 중 잘못된 부분이나 궁금한 사항이 있다면 언제든지 피드백 부탁 드립니다.
감사합니다.
'Data > SQL' 카테고리의 다른 글
SQL 고급 : 비등가 조인(Non-Equi Join) (0) | 2022.03.21 |
---|---|
SQL 고급 : 윈도우 함수(순위 함수) - RANK(), DENSE_RANK(), ROW_NUMBER() (0) | 2022.03.17 |
SQL 실무 : DAU 및 신규, 복귀, 기존 유저 구별하기 (3) | 2022.03.07 |
SQL 실무 : RFM 분석 (0) | 2022.02.23 |
SQL 실무 : 이커머스 주문 데이터 분석하기 (0) | 2022.02.22 |