DEVELOPERS 테이블에서 GRADE별 개발자의 정보를 조회하려 합니다. GRADE는 다음과 같이 정해집니다.
GRADE가 존재하는 개발자의 GRADE, ID, EMAIL을 조회하는 SQL 문을 작성해 주세요.
결과는 GRADE와 ID를 기준으로 오름차순 정렬해 주세요.
with tb as( select D.ID ,GROUP_CONCAT(S.NAME SEPARATOR '_') as skill ,GROUP_CONCAT(S.CATEGORY SEPARATOR '_') as skill_category from SKILLCODES as S, DEVELOPERS as D where S.CODE & D.SKILL_CODE > 0 group by 1 order by 1 ) select distinct case when tb.skill like '%Python%' and tb.skill_category like '%Front End%' then 'A' when tb.skill like '%C#%' then 'B' when tb.skill_category like '%Front End%' then 'C' end as GRADE ,D.ID ,D.EMAIL from SKILLCODES as S, DEVELOPERS as D, tb where 1=1 and D.ID = tb.ID HAVING 1=1 and GRADE IS NOT NULL order by 1, 2
SKILLCODES 테이블의 경우 테스트 케이스에 따라 스킬 CODE 값이 달라지기 때문에 문제를 푸는데 있어 조금 고생했다. (스킬 CODE 값이 고정값인 줄 알았다...)
추가로 해당 문제를 풀면서 불가피하게 GROUP BY 절 없이 HAVING 절을 사용했다.
GROUP BY 절을 사용하면 데이터베이스가 먼저 그룹화하고 그 후에 조건(HAVING)을 적용할 수 있어서 필터링 작업을 최적화할 수 있다. 반면에 HAVING 절만 사용하는 경우에는 모든 행을 그룹화한 후에 조건(HAVING)을 적용하므로 성능에 영향을 줄 수 있다. 때문에 일반적으로 HAVING 절은 GROUP BY 절 뒤에 작성하는 것을 권장한다.
https://school.programmers.co.kr/learn/courses/30/lessons/276036