https://school.programmers.co.kr/learn/courses/30/lessons/131116
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
코드
SELECT CATEGORY, PRICE AS MAX_PRICE, PRODUCT_NAME
FROM FOOD_PRODUCT
WHERE CATEGORY IN ('식용유', '과자', '국', '김치') AND PRICE IN (SELECT MAX(PRICE) FROM FOOD_PRODUCT GROUP BY CATEGORY)
ORDER BY MAX_PRICE DESC
쿼리 실행 순서
실행 순서 SQL 절 설명
1️⃣ | FROM | FOOD_PRODUCT 테이블에서 데이터를 조회 |
2️⃣ | WHERE CATEGORY IN ('식용유', '과자', '국', '김치') | 특정 CATEGORY 값만 필터링 |
3️⃣ | 서브쿼리 실행 (SELECT MAX(PRICE) FROM FOOD_PRODUCT GROUP BY CATEGORY) | 각 CATEGORY별 최대 PRICE 찾기 |
4️⃣ | WHERE PRICE IN (...) | 서브쿼리 결과에 포함된 PRICE 값만 남김 |
5️⃣ | SELECT | CATEGORY, PRICE AS MAX_PRICE, PRODUCT_NAME 선택 |
6️⃣ | ORDER BY MAX_PRICE DESC | PRICE 기준으로 내림차순 정렬 |
풀이
1️⃣ FROM FOOD_PRODUCT
- FOOD_PRODUCT 테이블에서 데이터를 가져옴.
2️⃣ WHERE CATEGORY IN ('식용유', '과자', '국', '김치')
- CATEGORY가 '식용유', '과자', '국', '김치'인 행만 남김.
3️⃣ 서브쿼리 실행 (SELECT MAX(PRICE) FROM FOOD_PRODUCT GROUP BY CATEGORY)
- 각 CATEGORY 그룹에서 MAX(PRICE) 값을 계산.
- 결과 예시:
- MAX(PRICE) ---------- 6500 1800 5000 4200
- 이 리스트에 있는 PRICE 값만 남도록 필터링됨.
4️⃣ WHERE PRICE IN (...) 조건 적용
- PRICE가 서브쿼리에서 나온 최대값 중 하나와 일치하는 행만 남김.
5️⃣ SELECT CATEGORY, PRICE AS MAX_PRICE, PRODUCT_NAME
- 최종적으로 CATEGORY, PRICE (MAX_PRICE), PRODUCT_NAME를 선택.
6️⃣ ORDER BY MAX_PRICE DESC
- PRICE 기준으로 내림차순 정렬.
오답 코드 1
SELECT CATEGORY, MAX(PRICE) AS MAX_PRICE, PRODUCT_NAME
FROM FOOD_PRODUCT
WHERE PRICE IS NOT NULL AND CATEGORY IS NOT NULL
AND CATEGORY IN ('과자', '국', '김치', '식용유')
GROUP BY CATEGORY
ORDER BY MAX_PRICE DESC;
문제점
- GROUP BY CATEGORY를 사용했기 때문에, 각 CATEGORY 그룹에서 단 하나의 PRODUCT_NAME만 선택해야 합니다.
- 하지만 PRODUCT_NAME은 GROUP BY에 포함되지 않았고, MAX(PRICE)와 같이 집계(AGGREGATION)되지도 않았습니다.
- 결과적으로 어떤 PRODUCT_NAME을 선택해야 하는지 모호하기 때문에 SQL 실행이 실패합니다.
해결 방법
각 CATEGORY에서 가격이 가장 높은 상품명을 정확하게 선택하려면 서브쿼리를 사용해야 합니다.
오답 코드 2
SELECT CATEGORY, PRICE AS MAX_PRICE, PRODUCT_NAME
FROM FOOD_PRODUCT
WHERE PRICE IN (SELECT MAX(PRICE) FROM FOOD_PRODUCT WHERE CATEGORY IN ('식용유', '과자', '국', '김치') GROUP BY CATEGORY)
ORDER BY MAX_PRICE DESC
문제점
서브쿼리에서 카테고리와 MAX(PRICE)에 해당하는 행을 뽑는 것이 아닌, 결과적으로 각 카테고리의 MAX(PRICE)와 같은 PRICE를 가진 행을 산출하기 때문에 잘못된 결과가 나옵니다.
그렇다면 PRODUCT_NAME이 이전과 같이 어떤 PRODUCT_NAME을 선택해야할지 모호하기 때문에 실패합니다. 그리고 CATEGORY도 서브쿼리에서만 걸러지고 메인 쿼리에서는 걸러지지않기에 문제가 발생합니다.
'프로그래머스' 카테고리의 다른 글
[프로그래머스 SQL] 없어진 기록 찾기 - 쿼리 실행 순서와 함께 보자 (0) | 2025.03.03 |
---|---|
[프로그래머스 SQL] 있었는데요 없었습니다 - 쿼리 실행 순서와 함께 보자 (0) | 2025.03.03 |
[프로그래머스 SQL] 고양이와 개는 몇 마리 있을까 - 쿼리 실행 순서와 함께 보자 (0) | 2025.03.02 |
[프로그래머스 SQL] 동명 동물 수 찾기 - 쿼리 실행 순서와 함께 보자 (0) | 2025.03.02 |
[프로그래머스 MySQL] 년, 월, 성별 별 상품 구매 회원 수 구하기 - 쿼리 실행 순서와 함께 보자 (0) | 2025.03.02 |