Inflearn brand logo image

인프런 커뮤니티 질문&답변

뇽뇽이님의 프로필 이미지
뇽뇽이

작성한 질문수

김영한의 실전 데이터베이스 - 기본편

조인의 특징

조인2 - 외부조인과 기타조인 : 조인의 특징

작성

·

35

0

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.


1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]

안녕하세요! 선생님 강의 잘 듣고 있습니다.
23:16초에서 "실무에서 이것이 왜 중요할까?"

부분이 잘 이해가 안가서 질문 드립니다.

 

제가 이해한 바로는

FROM users JOIN orders 와

FROM orders JOIN users 의 차이는

안에서 복제를 해서 전체 행의 수가 늘어나는지, 자식 테이블의 행 개수가 그대로 유지인지 이 차이이고,

결과물은 같다고 생각합니다. (inner join은 교집합이니깐)

 

그런데 지금 실무에서 이것이 왜 중요할까? 부분에서 <<집계함수인 COUNT(u.user_id)를 실행하면 어떻게 될까? 주문을 여러번 한 고객이 중복 계산되므로 전체 주문 수인 7이 나온다>>고 하셨는데 기준 테이블을 부모로 잡든 자식으로 잡든 결과는 똑같지 않나요?

 

제가 저 구문의 의도를 잘 파악하지못하여 질문 드립니다.

 

 

답변 2

0

안녕하세요, 뇽뇽이님.

(영한님이나 공식 서포터즈가 아닌, 일반 수강생의 답변이므로 정확하지 않을 수 있습니다.)


INNER JOIN의 경우 교집합에 대한 연산이므로 방향성이 존재하지 않습니다. 따라서 '결과물은 같다고 생각합니다'라고 말씀하신 부분은 적절합니다.

다만, '의도의 차이'가 존재한다고 생각하는데요.

 

예를 들어, SELECT ... FROM users JOIN orders ON ... 쿼리에서 추가로 "고객 수를 세고 싶다"는 요구를 추가하려고 한다고 가정합시다.

이때 무심코 FROM users 부분에만 집중하면 "users 테이블 가져왔으니까, COUNT(*) 호출하면 전체 고객 수 구할 수 있겠지"라고 오판을 내리게 될 위험이 존재합니다.

만약 이 위험을 알아채지 못하고, 그대로 집계한 후 내부 의사결정에 사용하게 된다면 '실제 고객 수보다 훨씬 많은 고객이 존재한다'고 생각하여 실제 쇼핑몰 사정에는 맞지 않는 결정을 내리게 되겠죠.

즉, 내 의도는 '전체 고객 수를 집계하는 것'인데 JOIN 연산의 특성에 의해 '의도와는 달리, 전체 주문 수를 집계해버리는' 상황이 발생한 것입니다.

 

이때 영한님이 언급하신 내용을 바탕으로 조인의 방향을 확실하게 고려한다면, "지금 PK -> FK 조인이니까, 결과 테이블 행이 기준 테이블(users) 행보다 늘어날 수 있겠군. 그러면 내 의도와 다르게 COUNT(*) 함수가 전체 고객수보다 많은 행을 집계할 위험이 있겠어."라고 미리 예측한 뒤, 대신 적절한 다른 대안으로 집계를 시도할 수 있습니다.

예를 들어, COUNT(DISTINCT user_id)와 같이 말이죠.


아마 뇽뇽이님께서는 해당 내용을 이미 제대로 이해하셔서 본인이 자각하지 못하는 빠른 시간 안에 위와 같은 판단을 내리신 것이라고 생각되네요.

0

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

뇽뇽이님이 질문하신 조인과 관련된 내용은 데이터베이스에서 빈번히 발생하는 주제입니다. INNER JOIN은 교집합을 찾는 것처럼 보일 수 있지만, 조인의 방향성과 테이블의 구조에 따라 결과가 달라질 수 있는 상황이 발생할 수 있습니다. 이는 특히 집계 함수와 같은 특수한 상황에서 더욱 가시화됩니다.

조인의 방향성과 결과 차이

  1. JOIN 방향성의 중요성:

    • FROM users JOIN ordersFROM orders JOIN users의 가장 큰 차이점은 데이터가 어떻게 결합되고 처리되는지에 영향을 미칠 수 있다는 것입니다. 특히 집계함수를 사용할 때, 어떤 테이블을 기준으로 JOIN을 하는지에 따라 결과가 달라질 수 있습니다.
  2. 집계 함수 사용 시 주의점:

    • 예를 들어, COUNT(u.user_id)를 사용할 때, 중복되는 데이터가 어떻게 해석되고 집계되는지에 따라 결과는 달라질 수 있습니다. 만약 주문을 여러 번 한 사용자를 기준으로 집계를 했다면, 각 주문마다 해당 사용자가 중복 계산되어, 전체 주문 수와 같이 보일 수 있습니다.

결론적으로, 조인의 방향성이 같아보이지만 실제로는 기준 테이블에 따라 데이터가 처리되는 방식이 달라질 수 있으며, 이는 실무에서 중요하게 고려해야 할 부분입니다. 특히, 집계나 분석용 쿼리를 작성할 때 이러한 차이를 이해하고 있는 것이 중요합니다.

아래는 관련된 질문과 답변이 제공되어 있는 URL을 추천드립니다. 이와 관련된 보다 구체적인 예시나 설명을 참고하시어 추가적인 학습이 가능하시길 바랍니다:

  1. 아우터 조인 기준 테이블 우선순위
  2. 진정한 JPA 성능 최적화

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

뇽뇽이님의 프로필 이미지
뇽뇽이

작성한 질문수

질문하기