본문 바로가기

Algorithm

[SQL 알고리즘] 프로그래머스 - 언어별 개발자 분류하기

✅ 프로그래머스 문제 - 언어별 개발자 분류하기

https://school.programmers.co.kr/learn/courses/30/lessons/276036

✅ 코드

with FRONT AS (
    SELECT SUM(CODE)
    FROM SKILLCODES
    WHERE CATEGORY = 'Front End'
)

SELECT
    CASE 
        WHEN SKILL_CODE & (SELECT * FROM FRONT) 
            AND SKILL_CODE & (SELECT CODE FROM SKILLCODES WHERE NAME = 'python')
        THEN 'A'
        
        WHEN SKILL_CODE & (SELECT CODE FROM SKILLCODES WHERE NAME = 'C#')
        THEN 'B'
        
        WHEN SKILL_CODE & (SELECT * FROM FRONT)
        THEN 'C'
    END AS `GRADE`, 
    ID,
    EMAIL
FROM
    DEVELOPERS
HAVING
    GRADE IS NOT NULL
ORDER BY GRADE, ID;

 


 

✏️ With 절

- 서브쿼리를 만들고 재사용 가능한 공동 테이블 표현식(Common Table Expression, CTE)

- 쿼리 단순화, 가독성 증가

- 반환된 data를 단일 쿼리에서 재사용 가능

 

WITH [cte_name] AS (
	SELECT [COLUMN_NAME(S)]
    FROM [TABLE_NAME]
    WHERE [CONDITION]
)

SELECT [COLUMN_NAME(S)]
FROM [TABLE_NAME]
JOIN [CTE_NAME] ON [JOIN_CONDITION]
WHERE [CONDITION]

 

 

📚 설명

- WITH절로 FRONT END 언어 코드의 합을 저장

- GRADE의 각 경우의 수에 활용

 


 

✏️ 공부한점

- 쿼리 실행 순서는 FROM / JOIN → WHERE → GROUP BY → HAVING →  SELECT → ORDER BY → LIMIT

인데 어떻게  HAVING이 필터링이 되는지 몰랐었다.

 

- SELECT의 컬럼 및 ALIAS절로 데이터 추출이 마지막에 수행되더라도 ALIAS절을 미리 인식해서 HAVING절에서 ALIAS를 사용할 수 있게 허용하는 DB가 있는데 MYSQL이 그 예이다.

- 다른 DBMS에서는 불가능하므로 가급적으로 사용하지않고 풀어야된다.