꿈은 데이터분석가, 취미는 계획

[MY SQL] 특정 카테고리의 스킬을 보유한 개발자 조회 본문

SQL/sql문풀

[MY SQL] 특정 카테고리의 스킬을 보유한 개발자 조회

data_2080 2024. 4. 28. 15:45
728x90

출처: [프로그래머스 스쿨 - 코딩테스트 연습 - MY SQL 문제] :  FrontEnd 개발자 찾기

링크: https://school.programmers.co.kr/learn/courses/30/lessons/276035


문제(일부):  스킬코드 정보 테이블과 개발자 정보 테이블을 통해 "Front End'스킬을 가진 개발자 정보를 조회


1. WITH절과 서브쿼리 활용풀이

0) 실수한 POINT

    2개의 테이블을 JOIN했을 때 여러 스킬을 보유한 경우
    중복된 개발자 정보 레코드가 발생함 => 중복을 고려한 쿼리 작성필요

1)  2개 테이블을 JOIN
     ON 조건에 &연산자를 사용하여 스킬코드 테이블의 스킬을 보유한 개발자 선택
     WEHRE절에서 카테고리가 "Front End"인 것으로 필터링

2) 메인쿼리의 WHERE절에서 서브쿼리를 사용하여
    WITH절에 있는 ID를 선택(Front End 스킬을 보유한 ID)

WITH FRONT_END AS (
    SELECT DISTINCT (DEV.ID)
    -- JOIN을 사용하면 여러개의 스킬을 보유한 경우 중복발생
    FROM SKILLCODES AS SK
        INNER JOIN DEVELOPERS AS DEV
            ON SK.CODE & DEV.SKILL_CODE = SK.CODE
            -- SKILL CODE의 스킬을 보유한 개발자
    WHERE SK.CATEGORY = "Front End"
    ORDER BY DEV.ID)
    
SELECT ID, EMAIL, FIRST_NAME, LAST_NAME
FROM DEVELOPERS 
WHERE ID IN (SELECT * FROM FRONT_END)
-- FRONT_END스킬이 있는 ID를 필터링
ORDER BY ID

 

2. GROUP BY와 서브쿼리 활용 풀이

0) 답안출처: https://school.programmers.co.kr/ques

1) WHERE절에서 서브쿼리를 사용하여 "Front End" 카테고리를 가진 개발자를 필터링
    *서브쿼리에서 "Front End" 카테고리인 코드들의 합과 메인쿼리의 

SELECT ID
        , EMAIL
        , FIRST_NAME
        , LAST_NAME
FROM DEVELOPERS
WHERE SKILL_CODE  & (
    SELECT SUM(CODE)
    FROM SKILLCODES 
    WHERE CATEGORY = 'Front End')
ORDER BY ID

3. JOIN과 GROUP BY 활용 풀이

0) 답안출처: https://school.programmers.co.kr/questions/72475

1) 2개 테이블을 JOIN
    ON조건 절에 |를 사용하여 스킬코드 테이블의 스킬을 보유한 개발자 선택

 2) WHERE 조건절에서 Front End 카테고리를 필터링

3) GROUP BY로 중복된 ID가 나오지 않게 함

SELECT D.ID, MAX(D.EMAIL) AS EMAIL, MAX(D.FIRST_NAME) AS FIRST_NAME, MAX(D.LAST_NAME) AS LAST_NAME
FROM DEVELOPERS D 
    INNER JOIN SKILLCODES S
        ON S.CODE | D.SKILL_CODE = D.SKILL_CODE
WHERE CATEGORY = 'Front End'
GROUP BY D.ID
ORDER BY D.ID

 

728x90