■ 출처
- 코딩테스트 : MySQL / Oracle / Lv.2
■ 연습문제
11. 업그레이드 된 아이템 구하기
INNER JOIN 구문 : 두 테이블을 조인할 때 두 테이블이 지정한 컬럼을 기준으로 조회
IN : 특정 컬럼에 조회하고 싶은 데이터 값이 여러 개일 때 사용하는 함수
#설명: 아이템의 회귀도가 'RARE'인 아이템들의 모든 다음 업데이트 아이템의 ID, 명, 회귀도를 조회
#참고: NESTED SUBQUERY 사용(WHERE절에서 서브쿼리 사용)
SELECT
B_Table.ITEM_ID,
A_Table.ITEM_NAME,
A_Table.RARITY
FROM
ITEM_INFO AS A_Table
INNER JOIN ITEM_TREE AS B_Table
ON A_Table.ITEM_ID = B_Table.ITEM_ID
WHERE
B_Table.PARENT_ITEM_ID IN (SELECT ITEM_ID FROM ITEM_INFO WHERE RARITY='RARE')
ORDER BY
ITEM_ID DESC
12. ROOT 아이템 구하기
#설명: ROOT 아이템을 찾아, 아이템의 ID, 명을 조회
#참고: PARENT형태 문제로써, 익숙해져야 하는 유형
SELECT
B_Table.ITEM_ID,
A_Table.ITEM_NAME
FROM
ITEM_INFO AS A_Table
INNER JOIN ITEM_TREE AS B_Table
ON A_Table.ITEM_ID = B_Table.ITEM_ID
WHERE
B_Table.PARENT_ITEM_ID IS NULL
ORDER BY
B_Table.ITEM_ID ASC
13. 조건에 맞는 아이템들의 가격의 총합계 구하기
#설명: 회귀도가 LEGEND인 아이템의 가격의 총합을 조회
SELECT
SUM(PRICE) AS TOTAL_PRICE
FROM
ITEM_INFO
WHERE
RARITY = 'LEGEND'
14. 조건에 부합하는 중고거래 상태 조회하기
CASE WHEN ~ THEN ~ ELSE END : 조건을 설정한 결과를 조회하기 위해 'IF~ELSE' 방법처럼 사용하는 함수
- 예시) CASE WHEN "조건식1" THEN '결과1'
WHEN "조건식2" THEN '결과2'
WHEN "조건식N" THEN '결과N' ELSE '나머지 결과' END
#설명: 22.10.05에 등록된 중고거래 게시물의 게시글ID, 작성자ID, 게시글 제목, 가격, 거래상태를 조회
SELECT
BOARD_ID, WRITER_ID, TITLE, PRICE,
(CASE WHEN STATUS = 'SALE' THEN '판매중'
WHEN STATUS = 'RESERVED' THEN '예약중'
WHEN STATUS = 'DONE' THEN '거래완료' END) AS STATUS
FROM
USED_GOODS_BOARD
WHERE
CREATED_DATE LIKE '2022-10-05'
ORDER BY
BOARD_ID DESC
15. 자동차 평균 대여 기간 구하기
DATEDIFF() : 날자 간 차이 결과를 조회
#설명: 평균 대여 기간이 7일 이상인 자동차들의 ID와 평균 대여 기간을 조회
#참고: DATEDIFF 함수는 날자간 차이를 구하므로, +1 처리를 해줘야함
SELECT
CAR_ID,
ROUND(AVG(DATEDIFF(END_DATE, START_DATE)), 1) +1 AS AVERAGE_DURATION
FROM
CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY
CAR_ID
HAVING
AVERAGE_DURATION >= 7
ORDER BY
AVERAGE_DURATION DESC, CAR_ID DESC
16. 자동차 종류 별 특정 옵션이 포함된 자동차 수 구하기
#설명: '통풍시트/열선시트/가죽시트' 중 하나 이상의 옵션이 포함된 자동차 종류별로 몇 대가 있는지 조회
SELECT
CAR_TYPE, COUNT(CAR_ID) AS CARS
FROM
CAR_RENTAL_COMPANY_CAR
WHERE
OPTIONS LIKE '%통풍시트%'
OR OPTIONS LIKE '%열선시트%'
OR OPTIONS LIKE '%가죽시트%'
GROUP BY
CAR_TYPE
ORDER BY
CAR_TYPE ASC
17. 조건에 맞는 도서와 저자 리스트 출력하기
#설명: 경제 카테고리에 속하는 도서들의 ID, 저자명, 출판일을 조회
SELECT
A_Table.BOOK_ID AS BOOK_ID,
B_Table.AUTHOR_NAME AS AUTHOR_NAME,
DATE_FORMAT(A_Table.PUBLISHED_DATE, '%Y-%m-%d') AS PUBLISHED_DATE
FROM
BOOK AS A_Table
LEFT JOIN AUTHOR AS B_Table
ON A_Table.AUTHOR_ID = B_Table.AUTHOR_ID
WHERE
A_Table.CATEGORY = '경제'
ORDER BY
A_Table.PUBLISHED_DATE ASC
18. 성분으로 구분한 아이스크림 총 주문량
#설명: 상반기 동안, 각 아이스크림 성분 타입과 타입별 총 주문량을 작은 순서대로 조회
SELECT
B_Table.INGREDIENT_TYPE,
SUM(TOTAL_ORDER) AS TOTAL_ORDER
FROM
FIRST_HALF AS A_Table
LEFT JOIN ICECREAM_INFO AS B_Table
ON A_Table.FLAVOR = B_Table.FLAVOR
GROUP BY
B_Table.INGREDIENT_TYPE
ORDER BY
TOTAL_ORDER
19. 진료과별 총 예약 횟수 출력하기
#설명: 22.05에 예약한 환자 수를 진료과코드별로 조회
SELECT
MCDP_CD AS '진료과코드',
COUNT(MCDP_CD) AS '5월예약건수'
FROM
APPOINTMENT
WHERE
APNT_YMD LIKE '%2022-05%'
GROUP BY
MCDP_CD
ORDER BY
COUNT(MCDP_CD) ASC, MCDP_CD ASC
20. 재구매가 일어난 상품과 회원 리스트 구하기
#설명: 동일 회원이 동일 상품을 구매한 데이터를 구하여, 재구매한 회원의 ID와 상품ID를 조회
#참고: 동일 회원과 상품에 대한 조회 결과를 구해야하므로, GROUP BY구문에 2개 조건을 입력해야 한다.
SELECT
USER_ID,
PRODUCT_ID
FROM
ONLINE_SALE
GROUP BY
USER_ID, PRODUCT_ID
HAVING
COUNT(PRODUCT_ID) >= 2
ORDER BY
USER_ID ASC, PRODUCT_ID DESC
21. 상품 별 오프라인 매출 구하기
OUTER JOIN 구문 : 두 테이블을 조인할 때 1개 테이블에만 데이터가 있어도 결과 조회
- RIGHT JOIN 구문 : OUTER JOIN 구문의 한 종류로써, 오른쪽 테이블의 모든 컬럼이 출력되도록 조회
#설명: 상품코드별 매출액 합계(판매가 * 판매량)를 조회
#참고: 테이블 정의를 보고, 어떤 방향으로 JOIN하는지가 중요하다
SELECT
A_Table.PRODUCT_CODE,
SUM(A_Table.PRICE * B_Table.SALES_AMOUNT) AS SALES
FROM
PRODUCT AS A_Table
LEFT JOIN OFFLINE_SALE AS B_Table
ON A_Table.PRODUCT_ID = B_Table.PRODUCT_ID
GROUP BY
A_Table.PRODUCT_CODE
ORDER BY
SALES DESC, A_Table.PRODUCT_CODE ASC
22. 가격대 별 상품 개수 구하기
#설명: 만원 단위의 가격대 별로 상품 개수를 조회
SELECT
/*(CASE WHEN PRICE >= 80000 THEN '80000'
WHEN PRICE >= 70000 THEN '70000'
WHEN PRICE >= 60000 THEN '60000'
WHEN PRICE >= 50000 THEN '50000'
WHEN PRICE >= 40000 THEN '40000'
WHEN PRICE >= 30000 THEN '30000'
WHEN PRICE >= 20000 THEN '20000'
WHEN PRICE >= 10000 THEN '10000' ELSE '0' END) AS PRICE_GROUP*/
FLOOR(PRICE/10000)*10000 AS PRICE_GROUP,
COUNT(*) AS PRODUCTS
FROM
PRODUCT
GROUP BY
PRICE_GROUP
ORDER BY
PRICE_GROUP ASC
23. 카테고리 별 상품 개수 구하기
#설명: 상품 카테고리 코드별 상품 개수를 조회
SELECT
LEFT(PRODUCT_CODE, 2) AS CATEGORY,
COUNT(PRODUCT_ID) AS PRODUCTS
FROM
PRODUCT
GROUP BY
CATEGORY
ORDER BY
CATEGORY ASC