민규의 흔적

[오라클 SQL] 프로그래머스 - 조건에 맞는 도서 리스트 출력하기 본문

프로그래머스 SQL

[오라클 SQL] 프로그래머스 - 조건에 맞는 도서 리스트 출력하기

민규링 2023. 10. 24. 22:57

지적 및 질문은 언제나 환영입니다 !

 

2023년 10월 24일

문제 링크 : 프로그래머스 - 조건에 맞는 도서 리스트 출력하기

 

문제 설명

 

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

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

 

 

문제

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

 

입력 예시

 

 

출력 예시

SQL을 실행하면 다음과 같이 출력되어야 한다.

 

 


 

TABLE 생성

CREATE TABLE BOOK(
    BOOK_ID NUMBER NOT NULL,
    CATEGORY VARCHAR(10) NOT NULL,
    AUTHOR_ID NUMBER NOT NULL,
    PRICE NUMBER NOT NULL,
    PUBLISHED_DATE DATE NOT NULL,
    PRIMARY KEY(BOOK_ID)
);

 

예시 데이터 삽입

INSERT INTO BOOK VALUES ( 1, '인문', 1, 10000, '2020-01-01');
INSERT INTO BOOK VALUES ( 2, '경제', 2, 9000, '2021-02-05');
INSERT INTO BOOK VALUES ( 3, '인문', 2, 11000, '2021-04-11');
INSERT INTO BOOK VALUES ( 4, '인문', 3, 10000, '2021-03-15');
INSERT INTO BOOK VALUES ( 5, '생활', 1, 12000, '2021-01-10');

 

 


 

질의 요구사항

  1. BOOK 테이블에서 BOOK_ID, PUBLISHED_DATE 검색
  2. '인문' 카테고리에 속하고, 2021년에 출판된 책이어야 함.
  3. 출판일을 기준으로 오름차순 정렬
  4. PUBLISHED_DATE 의 데이트 포맷이 예시와 동일해야 한다.(주의사항에 명시되어 있음)

 

SQL 쿼리문 작성

 

질의 요구사항대로 쿼리문을 하나씩 작성해보며 접근해보겠다.

 

1. BOOK 테이블에서 BOOK_ID, PUBLISHED_DATE 검색

 

BOOK 테이블의 모든 튜플들 중 BOOK_ID, PUBLISHED_DATE 애트리뷰트만 골라서 출력

 

 

 

쿼리문

SELECT BOOK_ID, PUBLISHED_DATE
FROM BOOK;

 

1번 질의 결과 릴레이션

 

 

 

2. '인문' 카테고리에 속하고, 2021년에 출판된 책이어야 함.

 

WHERE 절에 다음 두 가지 조건을 추가해서 튜플들을 걸러낸다.

 

1. CATEGORY = '인문'

 

2. TO_CHAR(PUBLISHED_DATE, 'YYYY' ) = '2021'

 

아마 이번 문제가 막혔다면, 2번 조건 질의 작성법을 잘 몰라서 막혔으리라 생각된다.

오라클에서 날짜를 비교하는 방법은 여러 가지가 있지만, 위와 같이 특정 연도 데이터만 추출해서 비교해야한다면 DATE 타입의 날짜를 문자형으로 변형시켜주고, 해당 값에서 맨 앞 4글자(연도)만 추출하여 비교하는 방법이 있다.

 

DATE 타입의 날짜를 정수형 변환 함수

TO_CHAR(SYSDATE, 'YYYYMMDDHH24MISS')
(만약 12시간제로 비교할 경우, 24를 12로 변경시켜 준다)

결과 > 20231024224325 ( 2023년 10월 24일 22시 43분 25초 )

반대로, 문자형 형태를 DATE 형태로 비교하고 싶은 경우, 다음 함수를 사용할 수 있다.
TO_DATE('20231024224325', 'YYYYMMDDHH24MISS')
(마찬가지로, 12시간제로 비교할 경우 24를 12로 변경시켜 준다)

결과 > 2023 / 10 / 24  22 : 43 : 25

 

 

 

쿼리문

SELECT BOOK_ID, PUBLISHED_DATE
FROM BOOK
WHERE TO_CHAR(PUBLISHED_DATE, 'YYYY') = '2021' AND CATEGORY = '인문';

 

2번 질의 결과 릴레이션

 

 

3. 출판일을 기준으로 오름차순 정렬

 

ORDER BY 절을 추가해주면 된다.

 

 

쿼리문

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

 

3번 질의 결과 릴레이션

 

 

3번 질의에 대한 쿼리문을 끝으로, 문제가 요구하는 결과 릴레이션 도출에 성공하였다...? 아니다 !

 

 

 

처음에 왜 안되지 하고 문제를 다시 읽어보다가, 문제 맨 밑 주의사항을 보고 이유를 깨달았다.

 

 

위 쿼리문대로 프로그래머스에서 실행해보면 PUBLISHED_DATE 데이터 포맷에 HH:MM:SS가 추가되어있는 것을 확인할 수 있다. 

추가로, 3번 질의 결과 릴레이션에서도 포맷을 정해주지 않으니 'YYYY/MM/DD' 포맷으로 출력된 모습을 알 수 있다.

 

이에 우리는 PUBLISHED_DATE 데이터 포맷을 픽스해주기 위해 4번째 질의문까지 수행해야 한다.

 

 

 

 

4. PUBLISHED_DATE 의 데이트 포맷이 예시와 동일해야 한다.

 

SELECT 절에 명시한 PUBLISHED_DATE 애트리뷰트에 'YYYY-MM-DD' 포맷을 지정해주는 질의를 추가하여준다.

 

 

쿼리문

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

 

4번 질의 결과 릴레이션

 

 

4번 질의에 대한 쿼리문을 끝으로, 문제가 요구하는 결과 릴레이션 도출에 성공하였다

 


 

풀이 후기

 

날짜 데이터를 비교하는 아직 많이 접해보지 않아서 그런지, DATE 타입 데이터에 조건을 걸어야 할 때 자꾸 뇌정지가 오게 된다. 문제를 더 많이 풀어봐야겠다.