SQL

[실무]프로그래머스 MySQL 기출문제 모음 Lv.5

노력하는 백곰 2024. 6. 5. 17:49

■ 출처

- 코딩테스트 : MySQL / Oracle / Lv.5

https://school.programmers.co.kr/learn/challenges?order=recent&languages=mysql%2Coracle&page=1&levels=5

 

코딩테스트 연습 | 프로그래머스 스쿨

개발자 취업의 필수 관문 코딩테스트를 철저하게 연습하고 대비할 수 있는 문제를 총망라! 프로그래머스에서 선발한 문제로 유형을 파악하고 실력을 업그레이드해 보세요!

school.programmers.co.kr

 

 

 

■ 연습문제

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