• 카테고리

    질문 & 답변
  • 세부 분야

    데이터 분석

  • 해결 여부

    해결됨

JOIN 연습문제 5번 문제 관련해서 질문이 있습니다!

24.05.08 20:14 작성 조회수 57

0

안녕하세요! 좋은 강의 감사드립니다. 도움이 많이 되고 있어요.

5번 문제 관련해서 질문이 있습니다. 5번 문제에 대해서 저는 쿼리를 이렇게 작성했습니다.

SELECT
  generation,
  COUNT(tp.id) AS pokemon_cnt
FROM
(
  SELECT
    id,
    trainer_id,
    pokemon_id,
    status
  FROM `basic.trainer-pokemon`
) AS tp
LEFT JOIN basic.trainer AS t
ON tp.trainer_id = t.id
LEFT JOIN basic.pokemon AS p
ON tp.pokemon_id = p.id
WHERE
  t.hometown = 'Incheon'
  AND tp.status IN ('Active', 'Training')
GROUP BY
  generation
ORDER BY
  pokemon_cnt DESC

강의에서 카일님과 다른 부분은 WHERE 절에 AND 가 더 추가된 부분이에요.

문제에서 '보유하고 있나요?' 라고 물어서 저는 저 조건을 추가해줬는데 카일님은 추가해주시지 않았는데도 제 쿼리와 결과가 같게 나오더라구요.

우연히 인천에 있는 트레이너들의 status가 다 Active, Training 이어서 이렇게 된 것인지 아니면 저 조건이 필요가 없는 것인지 궁금합니당!

답변 2

·

답변을 작성해보세요.

0

happycoding님 안녕하세요!

제가 강의에서 다룬 쿼리문은 다음과 같아요


SELECT
  generation,
  COUNT(tp.id) AS pokemon_cnt
FROM (
SELECT
  id,
  trainer_id,
  pokemon_id,
  status
FROM basic.trainer_pokemon
WHERE
  status IN ("Active", "Training")
) AS tp
LEFT JOIN basic.trainer AS t
ON tp.trainer_id = t.id 
LEFT JOIN basic.pokemon AS p
ON tp.pokemon_id = p.id
WHERE
  t.hometown = "Incheon"
GROUP BY
  generation

여길 보면 "trainer_pokemon"에서 id, train_id, pokemon_id, status를 가져오는(쿼리 상에서 5번째 줄부터 12번째 줄) 부분에서 status에 Active, Training을 걸어줬답니다. 해피코딩님은 바깥에서 하신거고 저는 서브 쿼리에서 실행한거죠. 지금의 쿼리가 결과론적으론 같을 수 있는데 저는 서브쿼리로 데이터를 줄인 후에 처리하고 싶어서 미리 서브쿼리에서 데이터를 줄였다고 보시면 됩니다

 

우연히 인천에 있는 트레이너들의 status가 다 Active, Training 이어서 이렇게 된 것인지에 대한 것은 실제 쿼리에서 확인해보시면 됩니다. 어떻게 쿼리를 작서해야 할까요? 데이터 검증 파트를 보시고 오셔도 괜찮고, 한번 작성해보셔요. 제가 바로 답을 드리면 해피코딩님이 그렇구나~라고 하실 수도 있어서 질문을 먼저 해봅니다

인천에 있는 트레이너들의 status가 Active, Training만 있는지 혹은 다른 Value도 있는지 확인하기 위해선 어떻게 쿼리를 작성해야 할까요?

 

 

아 카일님이 서브쿼리에서 작성하신 부분을 제가 놓쳤네요!😅 친절한 답변 감사합니다~ 말씀해신 부분도 고민해보도록 할게요 :D 좋은 하루 되세요!

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.05.08

안녕하세요, 인프런 AI 인턴입니다.

질문하신 JOIN 연습문제 5번과 관련하여, 필터링 조건에 관한 부분에서 혼란이 있으신 것 같습니다. 특히, WHERE 절에 AND tp.status IN ('Active', 'Training')를 추가하는 부분에 대한 궁금증인 것으로 이해됩니다.

이와 유사한 상황을 다룬 기존 답변을 찾아보니, 질문자님과 비슷한 상황에 대한 설명이 포함된 답변이 있어 이를 공유드립니다. 해당 설명은 다른 문제와 관련 있으나, JOIN 문제를 해결할 때 필터 조건을 어떻게 설정해야 하는지에 관한 이해를 돕는 데 도움이 될 수 있습니다.

관련 답변:

  • join 3번, 4번 문제에서는 LEFT JOINWHERE 조건을 어떻게 사용하는지에 대해 설명하고 있습니다. 선택적으로 결과를 필터링하는 데 있어 WHERE 절에서 상태를 명시하는 것과 관련해 유용한 인사이트를 제공합니다.

통상적으로 SQL 쿼리에서는 WHERE 절을 사용하여 결과를 필터링합니다. 질문하신 구체적인 상황에서, t.hometown = 'Incheon' AND tp.status IN ('Active', 'Training') 조건을 추가한 것은, 인천에 거주하는 트레이너들 중에서 활동 중이거나 훈련 중인 포켓몬에 초점을 맞추려는 의도로 해석될 수 있습니다. 이는 특정 조건에 맞는 레코드만을 결과에 포함시키려는 목적을 달성하기 위한 적절한 접근법입니다.

카일님의 쿼리에서 해당 조건을 명시하지 않았음에도 불구하고 결과가 같게 나왔다면, 우연히 해당 데이터 세트 내에서 인천에 거주하는 모든 트레이너들의 포켓몬 상태가 ‘Active’나 ‘Training’이었을 가능성이 있습니다. 이 경우, 추가적인 WHERE 조건이 결과에 영향을 미치지 않았을 것입니다.

이와 같이, SQL 쿼리를 작성할 때는 데이터의 구체적인 상황을 고려하여 조건을 추가하는 것이 중요합니다. 특정한 데이터 세트에 대해 더 정확한 결과를 얻기 위해 필요한 조건을 적절히 추가하는 것이 좋습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.