본문 바로가기

Skill Sets/SQL

[SQL] 조건에 맞는 도서와 저자 리스트 구하기(프로그래머스/MySQL/Level 2)

SMALL

안녕하세요! 데코입니다!

오늘은 프로그래머스 코딩테스트 연습에 있는 "조건에 맞는 도서와 저자 리스트 구하기" 문제를 포스팅하려고 합니다!

 

바로 포스팅 시작할게요! :)

(출처 : https://school.programmers.co.kr/learn/courses/30/lessons/144854)

1. 문제 :  조건에 맞는 도서와 저자 리스트 구하기(Lv. 2)

2. 문제 설명

다음은 어느 한 서점에서 판매 중인 도서들의 도서 정보(BOOK), 저자 정보(AUTHOR) 테이블입니다.
'BOOK' 테이블은 각 도서의 정보를 담은 테이블로 아래와 같은 구조로 되어있습니다.

 

[ 테이블 구조('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 ANIMAL_TYPE 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의 데이트 포맷이 예시와 동일해야 정답처리 됩니다.

3. 문제 풀이

# 1안
SELECT  BOOK_ID
        , AUTHOR_NAME
        , DATE_FORMAT(PUBLISHED_DATE, '%Y-%m-%d') AS PUBLISHED_DATE
  FROM  BOOK AS A
  LEFT 
  JOIN  AUTHOR AS B
    ON  A.AUTHOR_ID = B.AUTHOR_ID
 WHERE  A.CATEGORY = '경제'
 ORDER
    BY  PUBLISHED_DATE ASC
    
# 2안
SELECT  A.BOOK_ID
        , B.AUTHOR_NAME
        , DATE_FORMAT(A.PUBLISHED_DATE, '%Y-%m-%d') AS PUBLISHED_DATE
  FROM  (
        SELECT  *
          FROM  BOOK AS A
         WHERE  A.CATEGORY = '경제'
        ) A
  LEFT 
  JOIN  AUTHOR AS B
    ON  A.AUTHOR_ID = B.AUTHOR_ID
 ORDER
    BY  PUBLISHED_DATE ASC

이번 문제는 1안과 2안 두 가지로 작성했습니다!

 

# [ 문제 풀이 설명 ]

문제를 통해 BOOK 테이블과 AUTHOR 테이블을 결합해야 한다는 것을 알 수 있고

문제에서 요구한 사항은 아래와 같습니다!

 

조건 1. 도서 ID(BOOK_ID), 저자명(AUTHOR_NAME), 출판일(PUBLISHED_DATE) 컬럼을 출력(JOIN 필요)

조건 2. '경제' 카테고리에 속하는 도서(CATEGORY 컬럼 이용)

조건 3. 출판일(PUBLISHED_DATE) 컬럼 기준으로 오름차순

 

또 주의 사항에 나와 있는 것과 같이

날짜 형식을 맞춰야 합니다!

 

# [ 1안 쿼리 설명 ]

LEFT JOIN문을 통해 BOOK 테이블과 AUTHOR 테이블을 결합해 주었습니다!

두 테이블에서 결합을 해주기 위한 KEY 변수(= 공통 변수)는 'AUTHOR_ID'이기 때문에

ON 절에 'AUTHOR_ID'을 넣어 결합을 했습니다!

 

다음으로는 결합한 테이블에서 WHERE 문을 통해 조건에 해당하는 데이터만을 추출하였는데요!

CATEGORY 컬럼에서 '경제' 값만을 추출하기 위해 [ CATEGORY = '경제' ]을 이용하였습니다.

 

다음으로는 ORDER BY문을 통해 출판일 컬럼 기준으로 오름차순을 적용하였고

 

다음으로는 PUBLISHED_DATE 컬럼의 형식이 ' %Y-%m-%d %H:%i:%s ' 형태인 것을 확인해서

[출력 결과]와 동일하게 SELECT 문에 DATE_FORMAT() 함수를 이용해 ' %Y-%m-%d ' 형태로 변경했습니다!

[ DATE_FORMAT(PUBLISHED_DATE, '%Y-%m-%d') ]

 

그림으로 표현하면 아래 그림과 같습니다!

 

# [ 2안 쿼리 설명 ]

2안은 1안과 조금 차이가 있습니다.

 

BOOK 테이블과 AUTHOR 테이블을 결합해 주기 이전에

BOOK 테이블에서 CATEGORY 컬럼에서 '경제' 값만을 추출하기 위해 [ CATEGORY = '경제' ]을 먼저 이용하였습니다.

 

이후 AUTHOR 테이블과 결합해 주기 위하여  LEFT JOIN문을 통해 결합을 해주었습니다.

 

다음으로는 DATE_FORMAT() 함수를 이용해 ' %Y-%m-%d ' 형태로 변경했습니다!

[ DATE_FORMAT(PUBLISHED_DATE, '%Y-%m-%d') ]

 

그림으로 표현하면 아래 그림과 같습니다!

1안과 2안 쿼리의 조회 결과는 같아요!

 

쿼리에는 정답이 있는 것이 아니라 상황에 맞게 쿼리를 작성하고 실행결과가 목표로 하는 결과와 동일하면 되는데요!

데이터의 양이 너무 많은 경우

1안과 같이 LEFT JOIN을 먼저 실행하고 WHERE문을 적용한다면 JOIN 과정에서

데이터가 더 많아져서 비효율적이라고 생각을 했습니다!

 

2안과 같이 서브쿼리가 들어가더라도 필요한 컬럼과 필요한 조건에 해당하는 데이터를 추출하여

데이터의 size를 축소한 이후 JOIN이 이뤄진다면

조금 더 효율적이라고 생각해요!

 

더 좋은 쿼리 있다면 언제든 의견 달아주셔도 됩니다! :)


4. 데코의 문제 풀이 후기

이번 문제는 JOIN을 통해 두 테이블을 결합하고 특정 조건의 데이터를 조회하는 문제예요!

 

바로 이전 포스팅에서 다룬 '조건에 맞는 도서 리스트 구하기' 문제에서 JOIN만 추가가 되었는데요!

 

물론 하나의 테이블을 이용해서 분석이 이뤄지기도 하지만

대부분의 분석은 두 개 이상의 테이블을 결합해서 분석이 이뤄집니다

 

따라서 JOIN문은 SQL에서 정말 많이 이용이 되고 있습니다!

(python에서 분석을 할 때에도 정말 많이 이용하고요!)

 

이번 문제는 특정 조건의 데이터를 조회하는 문제를 풀어봤습니다!

 

설명이 어려운 부분 혹은 잘 이해가 안 가는 부분은 그리고 더 궁금한 내용이 있다면

언제든지 댓글로 남겨주세요!
빠르게 궁금증을 해결해드릴게요!

공감과 댓글은 큰 힘이 됩니다!
읽어주셔서 감사해요!

 

또 다른 SQL 문제로 찾아뵐게요!

LIST