프로그래머스에서 제공하는 SQL문제 매일 풀기 챌린지
문제 설명
다음은 어느 한 서점에서 판매중인 도서들의 도서 정보(BOOK), 저자 정보(AUTHOR) 테이블입니다.
BOOK 테이블은 각 도서의 정보를 담은 테이블로 아래와 같은 구조로 되어있습니다
Column name | Type | Nullable | Description |
BOOK_ID | INTEGER | FALSE | 도서 ID |
CATEGORY | VARCHAR(N) | FALSE | 카테고리 (경제, 인문, 소설, 생활, 기술) |
AUTHOR_ID | INTEGER | FALSE | 저자 ID |
PRICE | INTEGER | FALSE | 판매가 (원) |
PUBLISHED_DATE | DATE | FALSE | 출판일 |
AUTHOR 테이블은 도서의 저자의 정보를 담은 테이블로 아래와 같은 구조로 되어있습니다.
Column name | Type | Nullable | Description |
AUTHOR_ID | INTEGER | FALSE | 저자 ID |
AUTHOR_NAME | VARCHAR(N) | FALSE | 저자명 |
문제
'경제' 카테고리에 속하는 도서들의 도서 ID(BOOK_ID), 저자명(AUTHOR_NAME), 출판일(PUBLISHED_DATE) 리스트를 출력하는 SQL문을 작성해주세요.
결과는 출판일을 기준으로 오름차순 정렬해주세요.
예시
예를 들어 BOOK 테이블과 AUTHOR 테이블이 다음과 같다면
BOOK_ID | CATEGORY | AUTHOR_ID | PRICE | PUBLISHED_DATE |
1 | 인문 | 1 | 10000 | 2020-01-01 |
2 | 경제 | 1 | 9000 | 2021-04-11 |
3 | 경제 | 2 | 11000 | 2021-02-05 |
AUTHOR_ID | AUTHOR_NAME |
1 | 홍길동 |
2 | 김영호 |
'경제' 카테고리에 속하는 도서는 도서 ID가 2, 3인 도서이고, 출판일을 기준으로 오름차순으로 정렬하면 다음과 같은 결과가 나와야 합니다.
BOOK_ID | AUTHOR_NAME | PUBLISHED_DATE |
3 | 김영호 | 2021-02-05 |
2 | 홍길동 | 2021-04-11 |
주의사항
PUBLISHED_DATE의 데이트 포맷이 예시와 동일해야 정답처리 됩니다
오라클 정답
select b.book_id, a.author_name, to_char(b.published_date, 'RRRR-MM-DD') as published_date
from book b, author a
where b.author_id = a.author_id
and b.category = '경제'
order by b.published_date asc;
MySQL 정답
select b.book_id, a.author_name, date_format(b.published_date, '%Y-%m-%d') as published_date
from book b, author a
where b.author_id = a.author_id
and b.category = '경제'
order by b.published_date asc;
해설해보기
이 문제는 두 테이블에서 값을 동시에 가져와야 하기 때문에
JOIN을 사용해야 하는 문제이다.
이때 두 테이블에 동일한 컬럼(AUTHOR_ID)이 존재하기 때문에
EQUI JOIN을 사용할 수 있다.
EQUI JOIN은 연결조건에 각 테이블의 동일한 컬럼명을 넣고
이퀄(=) SIGN을 통해 연결해 주면 된다.
이때 각 컬럼명 앞에는 어느 테이블에 해당하는 컬럼인지
테이블 명 혹은 테이블 별칭을 작성하고 온점(.)으로 컬럼명과 연결해 준다.
( 연결 조건 컬럼 외에 다른 컬럼들이 동일하지 않다면,
테이블 명을 넣지 않아도 됨. 넣는 게 가독성 있고 성능이 약간 더 좋음)
ex ) BOOK.AUTHOR_ID
=> book 테이블의 author_id 컬럼
# 1. SELECT절
출력하고자 하는 컬럼명들을 나열하는데,
book 테이블의 book_id, author테이블의 author_name,
book 테이블의 published_date를 출력한다.
단, published_date는 아래와 같이 출력된다.
문제에서 제시된 것 처럼 데이트 포맷이 예시와 동일하게
시,분,초는 제외하고 출력되었기 때문에 데이터 포맷을 변경해줘야한다.
이때 사용할 수 있는 함수가
TO_CHAR 와 DATE_FORMAT 함수이다.
▶ 오라클 해설
TO_CHAR([컬럼명], '변경할 데이터 형태')
TO_CHAR([컬럼명], '변경할 데이터 형태')
위의 함수를 사용해서 날짜형 데이터 형식을 → 문자형 데이터 형식으로 변환한다.
* 표시한 형태 해석(오라클의 경우 대소문자 구분 없음)
- RRRR/YYYY : Year 연도 4자리로 표기(ex. 2023, 2024)
- MM : Month 월 2자리로 표기 (ex. 05, 07)
- DD : Day 일 2자리로 표기 (ex. 01, 31)
▶ MySQL 해설
날짜형식의 포맷을 지정해 주는
DATE_FORMATE([컬럼명], '변경할 데이터 형태' ) 함수
를 이용한다.
DATE_FORMATE([컬럼명], '변경할 데이터 형태' ) 함수
* 표시한 형태 해석(대소문자 구분 있음)
- %Y : Year 연도를 4자리로 표기 (ex. 2023, 2024)
- %m : Month 월을 2자리로 표기(ex. 05, 12)
- %d : Day 일을 두 자리로 표기(ex. 04, 28)
* 참고
- %c :Month 월을 한 자리로 표기(ex. 5, 12)
- %e :Day 일을 한자리로 표기(ex. 4, 28)
# 2. FROM 절
값을 가져올 테이블들을 나열해 준다.
이때 컬럼 앞에 붙이기 편하게 별칭을 지정해 준다.
# 3. WHERE절
--연결조건--
EQUI JOIN을 사용하여 연결조건을 작성해 준다.
이때 연결 컬럼으로 두 테이블에 동일하게 존재하는 컬럼인
AUTHOR_ID를 사용한다.
명심할 것은
동일한 컬럼이기 때문에 반드시 어느 테이블의 컬럼인지
명시적으로 작성해 주는 것이다.
--일반조건--
BOOK테이블의 CATEGORY컬럼에서 '경제' 카테고리에 속하는 도서만
출력해야 하기 때문에 일반조건을 생성한 후
AND연산자를 사용하여 연결조건 연결해준다.
# 4. ORDER BY절
출판일(PUBLISHED_DATE)을 기준으로
오름차순(ASC)으로 정렬한다.
이때 ASC는 기본값이기 때문에 생략해줘도 된다..
결과 출력
출처 : 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges
'SQL 문제 풀기 > 1. 프로그래머스 SQL : 2023.12.17~2024.2.29' 카테고리의 다른 글
<프로그래머스 42> 루시와 엘라 찾기(Lv.2) (0) | 2024.01.27 |
---|---|
<프로그래머스 41> 성분으로 구분한 아이스크림 총 주문량(Lv.2) (0) | 2024.01.26 |
<프로그래머스 39> 상품 별 오프라인 매출 구하기(Lv.2) (0) | 2024.01.24 |
<프로그래머스 38> 자동차 종류 별 특정 옵션이 포함된(Lv.2) (2) | 2024.01.23 |
<프로그래머스 37> 입양 시각 구하기1(Lv.2) (0) | 2024.01.22 |