■ 출처
- 코딩테스트 : MySQL / Oracle / Lv.5
■ 연습문제
1. 멸종위기의 대장균 찾기
#설명: 세대별 자식없는 개체의 수와 세대별 조회(세대를 오른차순 정렬/자식이 없는 개체가 적어도 1개체는 존재)
#재귀 쿼리를 사용하여 GENERATION 테이블 생성
WITH RECURSIVE GENERATION AS (#첫 번째 SELECT, 비반복(Non-Recursive)
SELECT ID, PARENT_ID, 1 AS GEN
FROM ECOLI_DATA
WHERE PARENT_ID IS NULL
UNION ALL
#두 번째 SELECT, 반복(Recursive)
SELECT A_Table.ID, A_Table.PARENT_ID, GEN + 1 AS GEN
FROM ECOLI_DATA AS A_Table
INNER JOIN GENERATION AS B_Table
ON A_Table.PARENT_ID = B_Table.ID)
SELECT
COUNT(*) AS COUNT,
GEN AS GENERATION
FROM
GENERATION
WHERE
#GENERATION 테이블에 자식이 없는 부모 대장균 조회(PARENT_ID 컬럼이 ID에 존재하지 않는다는 의미)
ID NOT IN (SELECT DISTINCT PARENT_ID
FROM GENERATION
WHERE PARENT_ID IS NOT NULL)
GROUP BY
GEN
2. 상품을 구매한 회원 비율 구하기
#설명: 21년에 가입한 전체 회원들 중, 상품 구매한 회원 수와 회원 비율을 년, 월별로 조회
SELECT
YEAR(B_Table.SALES_DATE) AS YEAR,
MONTH(B_Table.SALES_DATE) AS MONTH,
COUNT(DISTINCT B_Table.USER_ID) AS PURCHASED_USERS,
(ROUND(COUNT(DISTINCT B_Table.user_id)/(SELECT COUNT(*) FROM USER_INFO WHERE JOINED LIKE '2021%'), 1)) AS PUCHASED_RATIO
FROM
USER_INFO AS A_Table
INNER JOIN ONLINE_SALE AS B_Table
ON A_Table.USER_ID = B_Table.USER_ID
WHERE
A_Table.JOINED LIKE '2021%'
GROUP BY
YEAR, MONTH
ORDER BY
YEAR ASC, MONTH ASC
※ 쿼리문 실행 순서: FROM AND JOIN > WHERE > GROUP BY > HAVING > SELECT > ORDER BY > LIMIT