본문 바로가기
🗄️ DB_이야기/# ⚡SQL

🚀[SQL 알고리즘 문제 풀이] Programmers : 조건에 맞는 도서 리스트 출력하기(SELECT)

by gwon_s 2026. 4. 10.

👇 조건에 맞는 도서 리스트 출력하기(SELECT)

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

🔓 문제 설명

다음은 어느 한 서점에서 판매중인 도서들의 도서 정보(BOOK) 테이블입니다.

BOOK 테이블은 각 도서의 정보를 담은 테이블로 아래와 같은 구조로 되어있습니다.

 

문제 데이터 (BOOK)

BOOK_ID CATEGORY AUTHOR_ID PRICE PUBLISHED_DATE
1 인문 1 10,000 2020-01-01
2 경제 2 9,000 2021-02-05
3 인문 2 11,000 2021-04-11
4 인문 3 10,000 2021-03-15
5 생활 1 12,000 2021-01-10

⚡SQL Query

SELECT BOOK_ID, TO_CHAR(PUBLISHED_DATE, 'YYYY-MM-DD') AS PUBLISHED_DATE
FROM BOOK
WHERE CATEGORY = '인문'
  AND PUBLISHED_DATE >= TO_DATE('2021-01-01', 'YYYY-MM-DD')
  AND PUBLISHED_DATE <= TO_DATE('2021-12-31', 'YYYY-MM-DD')
ORDER BY PUBLISHED_DATE ASC;

🔎 풀이 설명

1. 날짜 필터링: 2021년 데이터를 추출하기 위해 범위를 2021-01-01 부터 2021-12-31 까지로 제한하였습니다.

2. 포맷팅: 문제의 주의사항에 따라 TO_CAHR 함수를 사용하여 날짜 형식을 YYYY-MM-DD로 맞췄습니다.

3. 정렬: ORDER BY PUBLISHED_DATE ASC 를 통해 출판일 기준 오름차순으로 나열했습니다.


💡인사이트

1. Index Range Scan vs Table Full Scan

  • CATEGORYPUBLISHED_DATE 컬럼에 인덱스가 없다면 Full Table Scan이 발생하므로, 두 테이블 간 [CATEGORY + PUBLISHED_DATE] 순으로 결합 인덱스가 있다면 '인문' 카테고리 내에서 2021년 범위만 인덱스를 타고 Index Range Scan이 가능합니다.

 

2. 조건절 주의

-- Bad
WHERE TO_CHAR(PUBLISHED_DATE, 'YYYY') = '2021'

-- Good
WHERE PUBLISHED_DATE >= TO_DATE('2021-01-01', 'YYYY-MM-DD')
  • 좌변 컬럼을 함수로 감싸서 가공하면 해당 컬럼에 생성된 인덱스를 사용할 수 없는 Index Usage Violation이 발생합니다. 우변을 가공하는 방식이 효율적입니다.

 

3. 데이터 타입 변환

  • 날짜 비교 시 문자열('2021-01-01')과 직접 비교하기 보다 TO_DATE를 사용하여 타입을 맞춰주는 것이 옵티마이저의 실행 계획을 안정적으로 유지하는데 유리합니다.