본문 바로가기

SQL

[SQL 챌린지] 해커랭크 정복하기 Day 8

✍ 제 머리로 코드를 짜내기 위한 챌린지입니다. (그동안 습관적으로 discussion창을 보곤 했거든요..)

 

🚀 이 포스팅 보신분 챌린지에 함께해요🤗 (함께하면 기쁨도 두 배! 서로 온라인 메이트가 되어보아요.)


[문제]

[Top Earners]


전 직원 중 급여가 가장 높은 직원의 급여와 직원수를 조회하세요.

[풀이]

[Oracle] 

 

SELECT *
FROM (SELECT MONTHS * SALARY, COUNT(EMPLOYEE_ID)
     FROM EMPLOYEE
     GROUP BY MONTHS * SALARY
     ORDER BY MONTHS * SALARY DESC
     )
WHERE ROWNUM = 1;

 

✍ 서브 쿼리를 사용한 이유가 무엇일까?

✍ 이런 계산을 위해선 서브쿼리를 써야한다는 것은 아는데, 왜 써야하는지... 생각을 안해봤다. (서브쿼리 추가 공부)

✍ 일단, 급여와 직원수를 알기 위해 서브 쿼리 SELECT 절에 그에 맞는 출력형식을 작성한다.

✍ 그리고 급여가 같은 직원들을 그룹으로 묶기 위해(나중에 급여가 가장 많은 직원들을 한꺼번에 출력해야 하기 때문에) GROUP BY 수행

급여가 가장 많은 그룹을 가장 상단으로 배치하기 위해 ORDER BY내림차순(DESC) 수행

✍ 본 쿼리의 WHERE 절에 가장 첫번째 행을 출력하는 ROWNUM=1 수행

 

 

[MySQL]

SELECT (Months * Salary)as earnings , Count(*) 
FROM Employee 
GROUP BY 1 
ORDER BY earnings DESC
limit 1;

MySQL 쿼리도 살펴봤다.

서브쿼리를 사용하지 않아서 oracle 보다 훨씬 간단해보인다. 

oracle의 서브쿼리와 거의 유사한데, MySQL은 GROUP BY에 SELECT에 출력되는 값의 순서에 따라 이름을 지정할 수 있다.

GROUP BY 1 이라함은 months*salary의 alias인 earnings를 뜻한다. 

✍ limit 1 또한 oracle의 where절에 작성하는 rownum = 1과 같은 의미다.