프로그래머스 - 언어별 개발자 분류하기 (feat. MySQL - with절)

박철현·2024년 3월 11일

프로그래머스

목록 보기
76/80

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

코드

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절

  • 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의 각 경우의 수에 활용해버리기~

의문점

  • HAVING으로 GRADE가 NULL인것을 제외했는데,
    SQL 순서 상 FROM, JOIN -> ON, WHERE -> GROUP 관련 -> SELECT 로 알고있는데 HAVING에서 어떻게 필터링이 되는거지?
    • 찾아보니 MYSQL에서는 예외적으로 처리 해주도록 해줌!
    • 하지만 다른 DBMS에서 불가능 할 수 있으니 가급적이면 사용하지 않고 문제를 풀어보기!

profile
비슷한 어려움을 겪는 누군가에게 도움이 되길

0개의 댓글