2026. 3. 3. 21:22ㆍ프로그래머스:sql 고득점 Kit
문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/131117
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
유튜브: https://youtu.be/4MaFGuxGQkg
나의 정답
WITH X AS(
SELECT PRODUCT_ID, SUM(AMOUNT) AS AMOUNT FROM FOOD_ORDER
WHERE MONTH(PRODUCE_DATE) =5
GROUP BY PRODUCT_ID
)
SELECT PRODUCT_ID, PRODUCT_NAME, (PRICE * AMOUNT) AS TOTAL_SALES
FROM FOOD_PRODUCT AS P INNER JOIN X USING(PRODUCT_ID)
ORDER BY (PRICE * AMOUNT) DESC, PRODUCT_ID
WHERE MONTH(PRODUCE_DATE) = 5 조건은 PRODUCE_DATE 컬럼 자체를 MONTH() 함수로 감싸서 가공하고 있습니다. 이렇게 조건절에서 탐색 대상 컬럼을 함수로 변형하게 되면, 데이터베이스는 해당 컬럼에 설정된 인덱스를 제대로 타지 못하고 테이블 전체를 스캔해야 하는 상황이 발생할 수 있습니다.
Q&A
질문
해당 컬럼이 어디에서 온건지 표기하면 쿼리의 실행 속도가 더 빨라지나?
답변
SQL에서 테이블 별칭(alias)을 명시한다고 해서 쿼리 실행 속도가 더 빨라지지는 않습니다! 🚀
PRICE가 FOOD_PRODUCT 테이블에만 있는 컬럼이라면, P.PRICE라고 적든 그냥 PRICE라고 적든 데이터베이스 엔진은 어느 테이블에서 가져와야 할지 이미 알고 있습니다.
컬럼의 출처를 밝히는 것은 데이터베이스의 속도를 위해서가 아니라, 쿼리를 읽는 사람👀이 헷갈리지 않게 하기 위해 작성하는 좋은 습관에 가깝습니다.
질문
함수를 사용하면 인덱스를 못 사용하는거야?
원본 테이블을 읽어오는거면 인덱스를 사용 가능한거고?
답변
조건절에서 컬럼을 함수로 가공하면 인덱스를 사용할 수 없는 경우가 많습니다.
💡 인덱스는 테이블의 원본 데이터를 기준으로 정렬되어 저장되는데, 컬럼에 함수를 씌워 값을 변형해 버리면 데이터베이스는 기존에 정리된 인덱스를 찾지 못하고 모든 행을 다 확인(풀 테이블 스캔)해야 하기 때문입니다.
질문WHERE PRODUCE_DATE LIKE '2022-05%' 하면 더 빠른가?
답변
만약 날짜형 컬럼에 LIKE를 쓰게 되면, 데이터베이스는 비교를 위해 날짜 데이터를 몰래 문자열로 바꾸는 작업(암시적 형변환)을 거치게 됩니다. 이는 아까 컬럼에 함수를 씌웠을 때 원본 데이터가 변형되어 인덱스를 제대로 타지 못했던 것과 비슷한 상황을 만들 수 있습니다
더 나은 정답
WITH X AS(
SELECT PRODUCT_ID, SUM(AMOUNT) AS AMOUNT FROM FOOD_ORDER
WHERE PRODUCE_DATE BETWEEN '2022-05-01 00:00:00' AND '2022-05-31 23:59:59'
# WHERE PRODUCE_DATE >= '2022-05-01' AND PRODUCE_DATE < '2022-06-01'
GROUP BY PRODUCT_ID
)
SELECT PRODUCT_ID, PRODUCT_NAME, (PRICE * AMOUNT) AS TOTAL_SALES
FROM FOOD_PRODUCT AS P INNER JOIN X USING(PRODUCT_ID)
ORDER BY (PRICE * AMOUNT) DESC, PRODUCT_ID
'프로그래머스:sql 고득점 Kit' 카테고리의 다른 글
| 상품을 구매한 회원 비율 구하기 (0) | 2026.03.08 |
|---|---|
| FrontEnd 개발자 찾기 (0) | 2026.03.04 |
| 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기 (0) | 2026.03.02 |
| 주문량이 많은 아이스크림들 조회하기 (0) | 2026.03.01 |
| 그룹별 조건에 맞는 식당 목록 출력하기 (0) | 2026.02.26 |