SQL 문제를 처음 풀면 WHERE(웨어) 조건부터 먼저 보게 되는 경우가 많습니다.

하지만 JOIN(조인)이 들어가는 문제는 조건보다 먼저, 어떤 테이블에서 시작하고 어떤 컬럼으로 연결할지를 정리하는 것이 더 중요합니다.

이 흐름이 먼저 보이면 쿼리를 읽을 때 훨씬 덜 헷갈립니다.

이 글의 문제는 SQL JOIN 연습을 위해 직접 구성한 예제입니다.


문제

온라인 상점에서는 상품마다 하나의 카테고리에 속해 있습니다.

상품 정보는 PRODUCTS 테이블에, 카테고리 정보는 CATEGORIES 테이블에 저장되어 있습니다.

PRODUCTS 테이블은 다음과 같습니다.

Column nameTypeNullable
PRODUCT_IDINTEGERFALSE
PRODUCT_NAMEVARCHAR(N)FALSE
CATEGORY_CODEINTEGERFALSE
PRICEINTEGERFALSE

각 컬럼은 다음을 의미합니다.

  • PRODUCT_ID : 상품 번호
  • PRODUCT_NAME : 상품명
  • CATEGORY_CODE : 카테고리 번호
  • PRICE : 가격

CATEGORIES 테이블은 다음과 같습니다.

Column nameTypeNullable
CATEGORY_CODEINTEGERFALSE
CATEGORY_NAMEVARCHAR(N)FALSE
CATEGORY_LEVELVARCHAR(N)FALSE

각 컬럼은 다음을 의미합니다.

  • CATEGORY_CODE : 카테고리 번호
  • CATEGORY_NAME : 카테고리 이름
  • CATEGORY_LEVEL : 카테고리 등급

구해야 하는 것은 카테고리 등급이 GOLD 인 카테고리에 속한 상품의 상품 번호(PRODUCT_ID), 상품명(PRODUCT_NAME), 가격(PRICE)입니다.

결과는 상품 번호를 기준으로 오름차순 정렬하면 됩니다.


처음 떠오르는 생각

처음에는 CATEGORIES 테이블에서 GOLD인 카테고리 번호만 먼저 찾고, 그 결과를 다시 PRODUCTS에 대입하면 되겠다고 생각할 수 있습니다.

물론 그렇게 두 단계로 생각해도 문제를 이해하는 데는 도움이 됩니다.

하지만 SQL에서는 이런 흐름을 JOIN으로 한 번에 자연스럽게 표현할 수 있습니다.


핵심 아이디어

이 문제에서 핵심은 두 테이블을 CATEGORY_CODE 기준으로 연결한 뒤, 연결된 결과에서 CATEGORY_LEVEL = 'GOLD' 조건만 남기는 것입니다.

즉 흐름은 아래처럼 정리할 수 있습니다.

  1. 기준이 되는 PRODUCTS 테이블을 잡는다
  2. CATEGORIES 테이블을 CATEGORY_CODE로 연결한다
  3. 연결된 결과에서 GOLD 등급만 필터링한다
  4. 필요한 컬럼만 선택한다
  5. PRODUCT_ID 기준으로 정렬한다

이 문제는 JOIN의 기본 구조를 연습하기 좋습니다.

  • FROM(프롬) : 기준이 되는 테이블 선택
  • JOIN(조인) : 다른 테이블 연결
  • ON(온) : 어떤 컬럼을 기준으로 연결할지 결정
  • WHERE(웨어) : 조건에 맞는 행만 남김
  • ORDER BY(오더 바이) : 정렬

코드

SELECT p.PRODUCT_ID, p.PRODUCT_NAME, p.PRICE
FROM PRODUCTS p
JOIN CATEGORIES c
  ON p.CATEGORY_CODE = c.CATEGORY_CODE
WHERE c.CATEGORY_LEVEL = 'GOLD'
ORDER BY p.PRODUCT_ID ASC;

코드 해설

FROM PRODUCTS p

FROM PRODUCTS p

기준이 되는 테이블을 PRODUCTS로 잡습니다.

여기서는 상품 정보를 조회하는 것이 목적이므로 출발점이 자연스럽게 PRODUCTS가 됩니다.

JOIN CATEGORIES c ON ...

JOIN CATEGORIES c
  ON p.CATEGORY_CODE = c.CATEGORY_CODE

상품 테이블만으로는 카테고리 등급 정보를 알 수 없기 때문에 CATEGORIES를 연결해야 합니다.

두 테이블에서 공통으로 대응되는 컬럼은 CATEGORY_CODE이므로 이 값을 기준으로 JOIN합니다.

WHERE c.CATEGORY_LEVEL = 'GOLD'

WHERE c.CATEGORY_LEVEL = 'GOLD'

연결된 결과 중에서 카테고리 등급이 GOLD인 경우만 남깁니다.

문제의 핵심 조건이 바로 이 줄에 담겨 있습니다.

ORDER BY p.PRODUCT_ID ASC

ORDER BY p.PRODUCT_ID ASC;

문제에서 상품 번호 기준 오름차순 정렬을 요구했으므로 마지막에 정렬 조건을 붙입니다.

ASC(어센딩)는 오름차순, DESC(디센딩)는 내림차순입니다.


실행 예시

예시 데이터는 아래와 같습니다.

PRODUCTS

PRODUCT_IDPRODUCT_NAMECATEGORY_CODEPRICE
101MOUSE_PAD112000
102USB_HUB128000
103LAPTOP_STAND235000
104TABLE_LAMP342000
105DESK_SHELF267000

CATEGORIES

CATEGORY_CODECATEGORY_NAMECATEGORY_LEVEL
1ACCESSORYGOLD
2DESK_SETUPSILVER
3LIGHTINGGOLD

카테고리 등급이 GOLD인 카테고리는 1, 3입니다.

이 카테고리에 속한 상품은 다음 세 개입니다.

  • 101 MOUSE_PAD
  • 102 USB_HUB
  • 104 TABLE_LAMP

따라서 결과는 아래처럼 나와야 합니다.

PRODUCT_IDPRODUCT_NAMEPRICE
101MOUSE_PAD12000
102USB_HUB28000
104TABLE_LAMP42000

정리

  • 이 문제는 JOINWHERE를 함께 연습하기 좋은 기본 문제입니다
  • CATEGORY_CODE로 두 테이블을 연결한 뒤 GOLD 조건만 남기면 됩니다
  • 문제를 볼 때는 어떤 테이블에서 시작하고, 어떤 컬럼으로 연결할지 먼저 정리하면 훨씬 덜 헷갈립니다

처음 SQL을 공부할 때는 문법을 외우는 것보다, 테이블을 어떻게 이어 붙이고 조건을 어디서 거를지를 순서대로 생각하는 연습이 더 중요합니다.

이런 기본 구조에 익숙해지면 이후의 INNER JOIN, LEFT JOIN, 집계 함수, 서브쿼리도 훨씬 수월하게 이해할 수 있습니다.