Every Step Matters

[프로그래머스 SQL Lv.2] 조건에 맞는 도서와 저자 리스트 출력하기 (MySQL) 본문

Database/SQL

[프로그래머스 SQL Lv.2] 조건에 맞는 도서와 저자 리스트 출력하기 (MySQL)

imnyoung 2026. 1. 4. 10:16

문제링크 : https://school.programmers.co.kr/learn/courses/30/lessons/144854

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

 

1. 테이블

(1) 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 출판일

(2) AUTHOR

Column name Type Nullable Description
AUTHOR_ID INTEGER FALSE 저자 ID
AUTHOR_NAME VARCHAR(N) FALSE 저자명

 

2. 문제

(1) '경제' 카테고리에 속하는 도서들의 (2) 도서 ID(BOOK_ID), 저자명(AUTHOR_NAME), 출판일(PUBLISHED_DATE) 리스트를 출력하는 SQL문을 작성해주세요. (3) 결과는 출판일을 기준으로 오름차순 정렬해주세요.

*주의: PUBLISHED_DATE의 데이트 포맷이 예시와 동일해야 정답처리 됩니다.

BOOK_ID AUTHOR_NAME PUBLISHED_DATE
3 김영호 2021-02-05
2 홍길동 2021-04-11

 

3. 문제풀이

출력해야 하는 리스트 중에 도서 ID와 출판일은 'BOOK' 테이블에 있고, 저자명은 'AUTHOR' 테이블에 있으므로 두 테이블을 JOIN해서 풀어야 하는 문제이다.

이때 INNER JOIN으로 두 개의 테이블을 연결하여 데이터를 조회한다. 조인 후 컬럼 조회 시에는 어떤 테이블의 컬럼인지 명시해주는 것이 좋지만, 이때 도서 ID(book_id)와 출판일(published_date)은 book 테이블에만 있는 컬럼명이고, 저자명(author_name)은 author 테이블에만 있는 컬럼명이므로 어떤 테이블의 컬럼인지 명시해주지 않아도 시스템이 알아서 적절한 테이블을 찾아간다.

하지만 만약 작성한 컬럼명이 두 테이블 모두에 있는 컬럼명(ex. AUTHOR_ID)이라면, 어떤 테이블의 컬럼인지 정확히 명시해 주어야 한다.

-- (2) 필요한 컬럼만 추출(모두 book에만 있는 컬럼명이므로 'b.' 필요없음. date_format 맞춰주기
SELECT book_id, author_name, DATE_FORMAT(published_date, '%Y-%m-%d') published_date   
FROM book b
INNER JOIN author a
ON b.author_id = a.author_id   -- author_id 기준 조인
테이블에 별칭을 지어주면 코드 길이가 현저히 줄어든다.
INNER JOIN 대신 간단하게 'JOIN'만 적어도 된다. (SQL에서 JOIN 키워드만 단독으로 사용하면 INNER JOIN이 default값)
DATE_FORMAT 함수를 이용해서 문제에서 요구하는 날짜 포맷으로 맞춰준다. date_format 함수 사용 방법 글 참고

이제 (1) '경제' 카테고리에 속하는 도서들을 찾고, (3) 마지막 결과는 출판일을 기준으로 오름차순 정렬해보자.

WHERE b.category = '경제'   -- (1) 카테고리가 '경제'인 도서만 뽑기
ORDER BY published_date  -- (3) 출판일 기준 오름차순 정렬
이 WHERE 조건을 조건 기준에 포함할 수도 있다. 단, JOIN에는 ON을 한 번만 쓸 수 있으므로 AND를 이용해서 ON 조건 안에 하나의 논리식으로 묶어야 한다.
SELECT book_id, author_name, DATE_FORMAT(published_date, '%Y-%m-%d') published_date  
FROM book b
INNER JOIN author a
ON b.author_id = a.author_id  
AND b.category = '경제'  --- WHERE 대신 AND를 활용해 ON에 연결되는 논리문으로 만든다.​

iNNER JOIN에서 두 결과는 같다. 하지만 이렇게 사용할 수도 있다만 알아두고, 가독성을 위해서는 WHERE을 쓰도록 하자.

 

 

4. 정답

따라서 정답은 

SELECT book_id, author_name, DATE_FORMAT(published_date, '%Y-%m-%d') published_date
FROM book b
INNER JOIN author a
ON b.author_id = a.author_id 
WHERE b.category = '경제'  
ORDER BY published_date