SQL 문제를 처음 풀면 WHERE(웨어) 조건부터 먼저 보게 되는 경우가 많습니다.
하지만 JOIN(조인)이 들어가는 문제는 조건보다 먼저, 어떤 테이블에서 시작하고 어떤 컬럼으로 연결할지를 정리하는 것이 더 중요합니다.
이 흐름이 먼저 보이면 쿼리를 읽을 때 훨씬 덜 헷갈립니다.
이 글의 문제는 SQL JOIN 연습을 위해 직접 구성한 예제입니다.
문제
온라인 상점에서는 상품마다 하나의 카테고리에 속해 있습니다.
상품 정보는 PRODUCTS 테이블에, 카테고리 정보는 CATEGORIES 테이블에 저장되어 있습니다.
PRODUCTS 테이블은 다음과 같습니다.
| Column name | Type | Nullable |
|---|---|---|
| PRODUCT_ID | INTEGER | FALSE |
| PRODUCT_NAME | VARCHAR(N) | FALSE |
| CATEGORY_CODE | INTEGER | FALSE |
| PRICE | INTEGER | FALSE |
각 컬럼은 다음을 의미합니다.
PRODUCT_ID: 상품 번호PRODUCT_NAME: 상품명CATEGORY_CODE: 카테고리 번호PRICE: 가격
CATEGORIES 테이블은 다음과 같습니다.
| Column name | Type | Nullable |
|---|---|---|
| CATEGORY_CODE | INTEGER | FALSE |
| CATEGORY_NAME | VARCHAR(N) | FALSE |
| CATEGORY_LEVEL | VARCHAR(N) | FALSE |
각 컬럼은 다음을 의미합니다.
CATEGORY_CODE: 카테고리 번호CATEGORY_NAME: 카테고리 이름CATEGORY_LEVEL: 카테고리 등급
구해야 하는 것은 카테고리 등급이 GOLD 인 카테고리에 속한 상품의
상품 번호(PRODUCT_ID), 상품명(PRODUCT_NAME), 가격(PRICE)입니다.
결과는 상품 번호를 기준으로 오름차순 정렬하면 됩니다.
처음 떠오르는 생각
처음에는 CATEGORIES 테이블에서 GOLD인 카테고리 번호만 먼저 찾고, 그 결과를 다시 PRODUCTS에 대입하면 되겠다고 생각할 수 있습니다.
물론 그렇게 두 단계로 생각해도 문제를 이해하는 데는 도움이 됩니다.
하지만 SQL에서는 이런 흐름을 JOIN으로 한 번에 자연스럽게 표현할 수 있습니다.
핵심 아이디어
이 문제에서 핵심은 두 테이블을 CATEGORY_CODE 기준으로 연결한 뒤, 연결된 결과에서 CATEGORY_LEVEL = 'GOLD' 조건만 남기는 것입니다.
즉 흐름은 아래처럼 정리할 수 있습니다.
- 기준이 되는
PRODUCTS테이블을 잡는다 CATEGORIES테이블을CATEGORY_CODE로 연결한다- 연결된 결과에서
GOLD등급만 필터링한다 - 필요한 컬럼만 선택한다
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_ID | PRODUCT_NAME | CATEGORY_CODE | PRICE |
|---|---|---|---|
| 101 | MOUSE_PAD | 1 | 12000 |
| 102 | USB_HUB | 1 | 28000 |
| 103 | LAPTOP_STAND | 2 | 35000 |
| 104 | TABLE_LAMP | 3 | 42000 |
| 105 | DESK_SHELF | 2 | 67000 |
CATEGORIES
| CATEGORY_CODE | CATEGORY_NAME | CATEGORY_LEVEL |
|---|---|---|
| 1 | ACCESSORY | GOLD |
| 2 | DESK_SETUP | SILVER |
| 3 | LIGHTING | GOLD |
카테고리 등급이 GOLD인 카테고리는 1, 3입니다.
이 카테고리에 속한 상품은 다음 세 개입니다.
101MOUSE_PAD102USB_HUB104TABLE_LAMP
따라서 결과는 아래처럼 나와야 합니다.
| PRODUCT_ID | PRODUCT_NAME | PRICE |
|---|---|---|
| 101 | MOUSE_PAD | 12000 |
| 102 | USB_HUB | 28000 |
| 104 | TABLE_LAMP | 42000 |
정리
- 이 문제는
JOIN과WHERE를 함께 연습하기 좋은 기본 문제입니다 CATEGORY_CODE로 두 테이블을 연결한 뒤GOLD조건만 남기면 됩니다- 문제를 볼 때는 어떤 테이블에서 시작하고, 어떤 컬럼으로 연결할지 먼저 정리하면 훨씬 덜 헷갈립니다
처음 SQL을 공부할 때는 문법을 외우는 것보다, 테이블을 어떻게 이어 붙이고 조건을 어디서 거를지를 순서대로 생각하는 연습이 더 중요합니다.
이런 기본 구조에 익숙해지면 이후의 INNER JOIN, LEFT JOIN, 집계 함수, 서브쿼리도 훨씬 수월하게 이해할 수 있습니다.