[프로그래머스 SQL Lv.2] 조건에 맞는 도서와 저자 리스트 출력하기 (MySQL)
문제링크 : 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