LV.1 조건에 맞는 도서 리스트 출력하기

문제
BOOK 테이블에서 2021년에 출판된 '인문' 카테고리에 속하는 도서 리스트를 찾아서 도서 ID(BOOK_ID), 출판일 (PUBLISHED_DATE)을 출력하는 SQL문을 작성해주세요.
결과는 출판일을 기준으로 오름차순 정렬해주세요.
해설
추출해야할 것 book_id, published_date(날짜 포맷)
조건 "인문" 분야와 "2021" 출판
정렬 published_date ASC
1. YEAR를 추출하는 함수를 이용하여 2021년 출판되고 인문 분야 도서를 가져온다
2. SELECT에서 날짜 포맷을 DATE_FORMAT으로 맞춰준다
이를 구현한 코드는 아래와 같다
SELECT book_id, DATE_FORMAT(published_date, '%Y-%m-%d') AS published_date
FROM book
WHERE category = "인문" AND YEAR(published_date) = "2021"
ORDER BY published_date
LV.2 조건에 맞는 도서와 저자 리스트 출력하기

문제
'경제' 카테고리에 속하는 도서들의 도서 ID(BOOK_ID), 저자명(AUTHOR_NAME), 출판일(PUBLISHED_DATE) 리스트를 출력하는 SQL문을 작성해주세요. 결과는 출판일을 기준으로 오름차순 정렬해주세요.
해설
추출해야할 것 book_id, author_name, published_date(날짜 포맷)
조건 "경제" 분야에 해당하는 필드
정렬 published_date ASC
1. author_name을 가져오기 위해 author 테이블에서 JOIN한다
2. 조건을 입력하고 정렬한다
이를 구현한 코드는 아래와 같다
SELECT book_id, author_name, DATE_FORMAT(published_date, '%Y-%m-%d') AS published_date
FROM book AS b INNER JOIN author AS a ON b.author_id = a.author_id
WHERE category = "경제"
ORDER BY published_date
-- WHERE을 안쓰는 버전
SELECT book_id, author_name, DATE_FORMAT(published_date, '%Y-%m-%d') AS published_date
FROM book AS b INNER JOIN author AS a ON b.author_id = a.author_id AND category = "경제"
ORDER BY published_date
* JOIN을 하는 쿼리에서 조건을 걸 때, WHERE과 ON에 걸 때 차이점
FROM -> WHERE의 순서로 실행하는 SQL 특성상
JOIN을 모두 해놓고 WHERE로 필터링을 할 경우와
JOIN 할 때 ON에서 필터링을 할 경우는 리소스 차이가 있다
문제와 같이 경제 분야의 필드만 갖고 오는 거라면
WHERE보단 ON에 걸 때 더 효율적이다.
(데이터셋이 몇 억개가 된다고 생각했을 때 체감이 될 것이다)
LV.3 카테고리별 도서 판매량 집계하기

문제
2022년 1월의 카테고리 별 도서 판매량을 합산하고, 카테고리(CATEGORY), 총 판매량(TOTAL_SALES) 리스트를 출력하는 SQL문을 작성해주세요.
결과는 카테고리명을 기준으로 오름차순 정렬해주세요
해설
추출해야할 것 category, SUM(sales)
조건 "2022년 01월"에 해당하는 카테고리별 판매량
정렬 category ASC
1. 판매데이터를 가져오기 위해 book_sales와 JOIN한다
2. 날짜 조건을 입력하고 오름차순 정렬한다
이를 구현한 코드는 아래와 같다
SELECT b.category, SUM(bs.sales)
FROM book as b INNER JOIN book_sales as bs ON b.book_id = bs.book_id
WHERE YEAR(bs.sales_date) = 2022 AND MONTH(bs.sales_date) = 1
GROUP BY b.category
ORDER BY b.category
SELECT b.category, SUM(bs.sales)
FROM book as b INNER JOIN book_sales as bs ON b.book_id = bs.book_id
WHERE bs.sales_date LIKE "%2022-01%"
GROUP BY b.category
ORDER BY b.category
--ON에 조건을 걸었을 때
SELECT b.category, SUM(bs.sales)
FROM book as b INNER JOIN book_sales as bs
ON b.book_id = bs.book_id AND bs.sales_date LIKE "%2022-01%"
GROUP BY b.category
ORDER BY b.category
LV.4 저자별 카테고리별 매출액 집계하기

문제
2022년 1월의 도서 판매 데이터를 기준으로 저자 별, 카테고리 별 매출액(TOTAL_SALES = 판매량 * 판매가) 을 구하여, 저자 ID(AUTHOR_ID), 저자명(AUTHOR_NAME), 카테고리(CATEGORY), 매출액(SALES) 리스트를 출력하는 SQL문을 작성해주세요. 결과는 저자 ID를 오름차순으로, 저자 ID가 같다면 카테고리를 내림차순 정렬해주세요
해설
추출해야할 것 author_id, author_name, category, total_sales
조건 "카테고리별, 저자별" 이중 GROUP BY, "2022-01"에 해당하는 날짜
정렬 author_id, category DESC
1. author, book, book_sales 테이블을 join한다
2. "2022년 01월에 해당하는 필드를 sales_date에서 가져온다
3. 카테고리별, 저자별로 GROUP BY한다
4. 두 가지 기준으로 정렬한다
이를 구현한 코드는 아래와 같다
SELECT a.author_id, a.author_name, b.category, SUM(b.price*bs.sales) AS total_sales
FROM (book AS b INNER JOIN author AS a ON b.author_id = a.author_id) INNER JOIN book_sales as bs
ON b.book_id = bs.book_id AND bs.sales_date LIKE "%2022-01%"
GROUP BY b.category, a.author_id
ORDER BY a.author_id, b.category DESC
--코드 간결화
SELECT a.author_id, a.author_name, b.category, SUM(b.price*bs.sales) AS total_sales
FROM author AS a JOIN book AS b USING(author_id)
JOIN book_sales AS bs USING(book_id)
WHERE bs.sales_date LIKE "%2022-01%"
GROUP BY b.category, a.author_id
ORDER BY a.author_id, b.category DESC
* 세 개의 테이블을 JOIN하는 문제였다.
아래 코드는 JOIN과 USING을 쓰면서 코드를 더 가독성 있게 바꾼 것이다
'Development > SQL' 카테고리의 다른 글
| [프로그래머스 스쿨 - MYSQL] 자동차 대여 문제 Lv.1 ~Lv.4 (2) | 2023.10.26 |
|---|---|
| [프로그래머스 스쿨 - MYSQL] 이커머스 문제 Lv.2 ~Lv.5 (0) | 2023.10.03 |
| [프로그래머스 스쿨 - MYSQL] 아이스크림 문제 Lv.1 ~Lv.4 (5) | 2023.10.01 |
| [프로그래머스 스쿨 - MYSQL] 자동차 문제 Lv.1 ~Lv.3 (0) | 2023.09.28 |
| [프로그래머스 스쿨 - MYSQL] 중고거래 문제 Lv.1 ~Lv.3 (0) | 2023.09.27 |