[프로그래머스][LV.1] 조건에 맞는 도서 리스트 출력하기 | Oracle

2025. 3. 20. 21:13프로그래머스/SQL

문제링크:  조건에 맞는 도서 리스트 출력하기


문제설명

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

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

문제

BOOK 테이블에서 2021년에 출판된 '인문' 카테고리에 속하는 도서 리스트를 찾아서 도서 ID(BOOK_ID), 출판일 (PUBLISHED_DATE)을 출력하는 SQL문을 작성해주세요.
결과는 출판일을 기준으로 오름차순 정렬해주세요.


 

문제풀이

이제 to_char의 사용법을 좀 알겠다

나의코드

SELECT BOOK_ID,to_char(PUBLISHED_DATE,'YYYY-MM-dd')
FROM BOOK
WHERE to_char(PUBLISHED_DATE,'YYYY')=2021
AND CATEGORY = '인문'
ORDER BY PUBLISHED_DATE;

 


 

더보기

참고하기

SELECT BOOK_ID, to_char(PUBLISHED_DATE, 'YYYY-MM-DD') AS PUBLISHED_DATE
FROM BOOK
WHERE EXTRACT(YEAR FROM PUBLISHED_DATE) = 2021
AND CATEGORY = '인문'
ORDER BY PUBLISHED_DATE;

인덱스를 사용할 가능성이 높아져 성능이 향상된다고 함.


 

  • to_char(PUBLISHED_DATE, 'YYYY') = '2021' 대신, 날짜 함수 EXTRACT(YEAR FROM PUBLISHED_DATE) 사용이 더 효율적입니다.
  • PUBLISHED_DATE가 DATE 타입이라면, 필터링 과정에서 함수 사용을 최소화하는 것이 성능 면에서 유리합니다.

 

1. to_char(PUBLISHED_DATE, 'YYYY') = '2021'의 문제점

WHERE to_char(PUBLISHED_DATE, 'YYYY') = '2021'

이 방식은 PUBLISHED_DATE가 DATE 타입이어도 문자열 변환을 수행하여 비교하기 때문에 비효율적입니다.

문제점 1: 인덱스 사용 불가능

  • PUBLISHED_DATE에 인덱스(예: B-TREE INDEX)가 걸려 있다면, 원래는 인덱스를 사용하여 빠르게 검색할 수 있습니다.
  • 하지만 to_char(PUBLISHED_DATE, 'YYYY')처럼 컬럼에 함수를 적용하면 인덱스가 무효화되어 모든 행을 검사해야 합니다.
    즉, "Full Table Scan"이 발생하여 성능이 저하될 수 있습니다.

문제점 2: 불필요한 문자열 변환

  • to_char(PUBLISHED_DATE, 'YYYY')는 숫자를 문자열로 변환한 뒤 '2021'과 비교합니다.
  • 불필요한 변환 과정이 추가되므로 성능이 떨어집니다.

2. EXTRACT(YEAR FROM PUBLISHED_DATE) = 2021 사용의 장점

WHERE EXTRACT(YEAR FROM PUBLISHED_DATE) = 2021

이 방식은 PUBLISHED_DATE의 연도를 직접 추출하여 숫자로 비교합니다.

장점 1: 인덱스 활용 가능성 증가

  • 일부 최적화된 DB 엔진(예: PostgreSQL, MySQL, Oracle)에서는 EXTRACT(YEAR FROM PUBLISHED_DATE)를 사용할 경우 인덱스를 활용할 가능성이 있습니다.
  • 특히 PUBLISHED_DATE에 함수가 적용되지 않았을 때 인덱스를 활용할 수 있습니다.

장점 2: 숫자 비교는 문자열 비교보다 빠름

  • to_char(PUBLISHED_DATE, 'YYYY') = '2021'은 내부적으로 문자열 변환을 수행하지만,
    EXTRACT(YEAR FROM PUBLISHED_DATE) = 2021은 연도를 정수형 데이터로 가져와 비교하기 때문에 성능이 더 좋습니다.

💡 가장 좋은 방법 (DATE 범위를 직접 필터링)

DB 엔진이 인덱스를 확실하게 활용할 수 있도록 날짜 범위 조건을 사용하는 것이 가장 효율적입니다.

WHERE PUBLISHED_DATE >= DATE '2021-01-01' 
AND PUBLISHED_DATE < DATE '2022-01-01'

장점

  1. PUBLISHED_DATE 컬럼에 대한 인덱스를 100% 활용할 수 있음
  2. 함수 적용 없이 빠른 비교 연산 수행
  3. 가장 성능이 좋은 방법으로, EXTRACT(YEAR FROM PUBLISHED_DATE) = 2021보다 더 빠를 수도 있음

🚀 정리

방식 인덱스 사용 가능성 성능(빠름 → 느림) 추천 여부
PUBLISHED_DATE BETWEEN '2021-01-01' AND '2021-12-31' ✅ O 🚀🚀🚀 (가장 빠름) ✅ 적극 추천
EXTRACT(YEAR FROM PUBLISHED_DATE) = 2021 ✅ (일부 DB) 🚀🚀 (빠름) ✅ 추천
to_char(PUBLISHED_DATE, 'YYYY') = '2021' ❌ X 🚀 (느림) ❌ 비추천

결론적으로, 날짜 범위를 직접 비교하는 방식이 가장 좋은 방법이며,
EXTRACT(YEAR FROM PUBLISHED_DATE)는 차선책으로 고려할 수 있습니다.