프로그래머스 - 언어별 개발자 분류하기
코드
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에서 불가능 할 수 있으니 가급적이면 사용하지 않고 문제를 풀어보기!
