본문 바로가기
SQL 문제 풀기/1. 프로그래머스 SQL : 2023.12.17~2024.2.29

<프로그래머스 40> 조건에 맞는 도서와 저자 리스트 출력하기(Lv.2)

by HYEHYE_SON 2024. 1. 25.
728x90

 

프로그래머스에서 제공하는 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

반응형