일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 오라클
- 문자열
- 깊이우선탐색
- 브루트포스 알고리즘
- oracle
- 다익스트라
- 완전탐색
- Python
- 너비우선탐색
- 자바스크립트
- 백준 알고리즘
- 그래프 탐색
- 그리디 알고리즘
- 데이터베이스
- 백트래킹
- SWEA
- 프로그래머스
- BFS
- 파이썬
- 브루트포스
- javascript
- DP
- DFS
- 스택
- 너비 우선 탐색
- 그래프 이론
- SW Expert Academy
- 다이나믹 프로그래밍
- 백준알고리즘
- 구현
- Today
- Total
민규의 흔적
[오라클 SQL] 프로그래머스 - 조건에 맞는 도서 리스트 출력하기 본문
지적 및 질문은 언제나 환영입니다 !
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');
질의 요구사항
- BOOK 테이블에서 BOOK_ID, PUBLISHED_DATE 검색
- '인문' 카테고리에 속하고, 2021년에 출판된 책이어야 함.
- 출판일을 기준으로 오름차순 정렬
- PUBLISHED_DATE 의 데이트 포맷이 예시와 동일해야 한다.(주의사항에 명시되어 있음)
SQL 쿼리문 작성
질의 요구사항대로 쿼리문을 하나씩 작성해보며 접근해보겠다.
1. BOOK 테이블에서 BOOK_ID, PUBLISHED_DATE 검색
BOOK 테이블의 모든 튜플들 중 BOOK_ID, PUBLISHED_DATE 애트리뷰트만 골라서 출력
쿼리문
SELECT BOOK_ID, PUBLISHED_DATE
FROM BOOK;
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 = '인문';
3. 출판일을 기준으로 오름차순 정렬
ORDER BY 절을 추가해주면 된다.
쿼리문
SELECT BOOK_ID, PUBLISHED_DATE
FROM BOOK
WHERE TO_CHAR(PUBLISHED_DATE, 'YYYY') = '2021' AND CATEGORY = '인문'
ORDER BY PUBLISHED_DATE;
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번 질의에 대한 쿼리문을 끝으로, 문제가 요구하는 결과 릴레이션 도출에 성공하였다
풀이 후기
날짜 데이터를 비교하는 아직 많이 접해보지 않아서 그런지, DATE 타입 데이터에 조건을 걸어야 할 때 자꾸 뇌정지가 오게 된다. 문제를 더 많이 풀어봐야겠다.
'프로그래머스 SQL' 카테고리의 다른 글
[오라클 SQL] 프로그래머스 - 조건에 맞는 사용자와 총 거래금액 조회하기 (0) | 2023.10.20 |
---|---|
[오라클 SQL] 프로그래머스 - 가격이 제일 비싼 식품의 정보 출력하기 (2) | 2023.10.19 |
[오라클 SQL] 프로그래머스 - 12세 이하인 여자 환자 목록 출력하기 (2) | 2023.10.19 |