Inflearn brand logo image

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

정유진님의 프로필 이미지
정유진

작성한 질문수

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

문제와 풀이1

문제4 - orders를 기준으로 할 경우

작성

·

43

0

1. 강의 내용과 관련된 질문인가요? 예
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예
3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예

[질문 내용]

users 말고, orders 기준으로 쿼리를 작성 중인데요 여기서 봉착한 난관이... 주문 기록이 없다면, null로 표현되는 부분을 어떻게 풀어나가야 할지 모르겠어서 문의드립니다ㅠㅠ


SELECT u.name as user_name, p.name as product_name

FROM orders AS o

LEFT JOIN users AS u ON o.user_id=u.user_id

LEFT JOIN products AS p ON o.product_id=p.product_id

ORDER BY u.name, p.name;

답변 4

1

안녕하세요, 정유진님.

먼저 말씀하신 문제를 해결할 수 있는 코드를 먼저 제시해드린 뒤에 설명 이어가겠습니다. 올려주신 코드에서 LEFT JOIN users ... 부분을 RIGHT JOIN users ...로만 변경해주시면 됩니다.

SELECT 
  u.name AS user_name, 
  p.name AS product_name
FROM 
  orders o
RIGHT JOIN 
  users u ON o.user_id = u.user_id
LEFT JOIN 
  products p ON o.product_id = p.product_id
ORDER BY 
  u.name, p.name
;

실행 결과

스크린샷 2025-08-24 00.02.14.png

 


어려움을 겪으신 부분이 orders 테이블 기준으로 쿼리를 작성할 때 주문 기록이 없다면, null로 표현되는 부분이라고 하셨는데요.

저도 실력이 좋지는 않지만 조언을 드리자면 '무엇을 무조건 남겨야 하는가' 에 대해 집중하시면 말씀하신 문제를 풀어나가는 데에 도움이 될 거예요.

예를 들어 이 문제에서는 (주문 내역이 없더라도) 고객 이름을 무조건 남겨야 합니다.

따라서 고객 이름 컬럼이 존재하는 users 테이블 쪽으로 OUTER JOIN을 수행하시면 됩니다. orders를 기준 테이블로 쿼리를 작성하셨으니 users 테이블 쪽은 RIGHT가 되겠네요.

추가로 이런 경우에는 애초에 기준 테이블을 '무조건 남겨야 되는 컬럼이 있는 테이블(users)'로 설정하고 LEFT JOIN orders로 해결하는 방식이 더 적절하다고 여겨집니다.

영한님이 해주신 답변에서는

'만약 주문은 있지만 회원은 없는 경우를 찾고 싶다면 이 경우 RIGHT JOIN을 사용해야 합니다.'

부분을

'만약 주문은 없지만 회원은 있는 경우를 찾고 싶다면 이 경우 RIGHT JOIN을 사용해야 합니다.'

으로만 바꾸면 원하시는 답이 되겠네요.

1

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 정유진님

orders에서 쿼리를 시작하게 되면 주문 내역이 없는 orders 행은 존재할 수 없습니다.

만약 주문은 있지만 회원은 없는 경우를 찾고 싶다면 이 경우 RIGHT JOIN을 사용해야 합니다.

감사합니다.

0

정유진님의 프로필 이미지
정유진
질문자

부족해서 답변주신 내용을 이해하지 못 했습니다ㅠㅠ알려주신 부분은 이해했는데, 문의한 부분에 대한 답은 아닌 거 같습니다!

0

안녕하세요, 인프런 AI 인턴입니다. 정유진님.

주문 기록이 없을 경우, LEFT JOIN을 사용해 조회할 때 null로 표현되는 부분에 대한 해결책을 찾고 계시는군요. LEFT JOIN은 데이터베이스 테이블을 조인할 때, 왼쪽 테이블(여기서는 orders)의 모든 레코드를 반환하고, 오른쪽 테이블(usersproducts)에서 일치하는 레코드가 없는 경우는 null로 반환하는 방식입니다.

클라이언트 애플리케이션에서 null 값을 처리할 수 있는 방법을 고려해보세요. 예를 들어, 쿼리 결과를 받아오는 애플리케이션 코드 내부에서 null 값을 특정 문자열이나 값으로 대체할 수 있습니다.

만약 SQL 쿼리 내에서 null 값을 바로 처리하고 싶다면, COALESCE 함수를 사용하여 null을 다른 값으로 대체할 수 있습니다. 아래와 같이 사용할 수 있습니다:

SELECT
    COALESCE(u.name, 'Unknown User') AS user_name,
    COALESCE(p.name, 'Unknown Product') AS product_name
FROM
    orders AS o
LEFT JOIN
    users AS u ON o.user_id = u.user_id
LEFT JOIN
    products AS p ON o.product_id = p.product_id
ORDER BY
    u.name, p.name;

이 쿼리는 users 또는 products에 해당하는 레코드가 없을 경우, user_nameproduct_name을 각각 ‘Unknown User’와 ‘Unknown Product’로 대체하여 반환하게 됩니다.

또한, 추가적인 예제나 설명이 필요한 경우라면 아래의 참고 링크를 확인하시면 도움이 될 것입니다:
- 질문 877966: 외래키가 없는 경우 조회

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

정유진님의 프로필 이미지
정유진

작성한 질문수

질문하기