[프로그래머스][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'
장점
- PUBLISHED_DATE 컬럼에 대한 인덱스를 100% 활용할 수 있음
- 함수 적용 없이 빠른 비교 연산 수행
- 가장 성능이 좋은 방법으로, 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)는 차선책으로 고려할 수 있습니다.
'프로그래머스 > SQL' 카테고리의 다른 글
[프로그래머스][LV.2] 업그레이드 된 아이템 구하기 | python3 (0) | 2025.03.25 |
---|---|
[프로그래머스][LV.2] 재구매가 일어난 상품과 회원 리스트 구하기 | Oreacle (0) | 2025.03.22 |
[프로그래머스][LV.3] 과일로 만든 아이스크림 고르기 | Oracle (0) | 2025.03.22 |
[프로그래머스][LV.2] 3월에 태어난 여성 회원 목록 출력하기 | Oracle (0) | 2025.03.19 |
[프로그래머스][LV.1] 흉부외과 또는 일반외과 의사 목록 출력하기 | Oracle (1) | 2025.03.18 |