| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
- where
- having
- 날짜 포맷
- 해외결제
- inner join
- 트래블테크
- date_format
- IELTS
- 금융 플랫폼
- programmers
- MySQL
- Python
- count
- order by
- SQL
- 투자자산운용사
- SubQuery
- is null
- 도서추천
- 서브쿼리
- ifnull
- LIMIT
- join
- alias
- IS NOT NULL
- GROUP BY
- IN
- Round
- MAX
- 금융IT
- Today
- Total
Every Step Matters
[프로그래머스 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
'Database > SQL' 카테고리의 다른 글
| [프로그래머스 SQL Lv.3] 물고기 종류 별 대어 찾기 (MySQL) (0) | 2026.01.05 |
|---|---|
| [프로그래머스 SQL Lv.2] 진료과별 총 예약 횟수 출력하기 (MySQL) (0) | 2026.01.05 |
| [MySQL] MySQL 현재 날짜 및 시간 출력 방법 (0) | 2026.01.03 |
| [SQL] SQL SELECT 쿼리 작성 순서와 실행 순서 정리 (0) | 2026.01.03 |
| [SQL] IN과 EXISTS의 차이 (0) | 2025.12.07 |