👇 조건에 맞는 도서 리스트 출력하기(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
- CATEGORY와 PUBLISHED_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를 사용하여 타입을 맞춰주는 것이 옵티마이저의 실행 계획을 안정적으로 유지하는데 유리합니다.
'🗄️ DB_이야기 > # ⚡SQL' 카테고리의 다른 글
| 🚀[SQL 알고리즘 문제 풀이] Programmers : 과일로 만든 아이스크림 고르기(SELECT) (0) | 2026.04.13 |
|---|---|
| 🚀[SQL 알고리즘 문제 풀이] Programmers : 12세 이하인 여자 환자 목록 출력하기(SELECT) (1) | 2026.04.13 |
| 🚀[SQL 알고리즘 문제 풀이] Programmers : 인기있는 아이스크림(SELECT) (0) | 2026.04.10 |
| 🚀[SQL 알고리즘 문제 풀이] Programmers : 평균 일일 대여 요금 구하기(SELECT) (1) | 2026.04.10 |
| [SQL] SQL 기본 개념 (0) | 2026.04.03 |