작성
·
225
1
강사님 안녕하세요.
Top Earners(GROUP BY, HAVING) 문제 관련하여 질문드립니다.
제 생각에는 아래와 같은 쿼리로 답을 도출할 수 있을 것 같은데 의도한 대로 실행되지 않아서 질문드립니다.
SELECT months * salary as earnings
, count(*)
FROM employee
GROUP BY earnings
HAVING earnings = MAX(earnings);
earnings를 산출
earnings를 기준으로 그룹핑
earnings의 값이 최대값인 데이터만 조회
이런 생각으로 쿼리를 작성하였습니다.
그런데 최대 earnings에 해당하는 데이터만 조회되는 것이 아니라, 모든 earnings 별 데이터가 다 조회되는 것으로 나타났습니다.
어떤 이유에서 이렇게 동작한 것인지 질문드립니다.
강의 덕분에 mysql 잘 배우고 있습니다. 감사합니다.
답변 1
3
생각하신 로직에는 문제가 없으나, 이대로 작동하기 위해서는 HAVING 절에 수정이 필요합니다.
HAVING 절에서의 연산은 GROUP BY 에서 묶은 그룹별로 수행됩니다.GROUP BY earnings
HAVING earnings = MAX(earnings)
이렇게 썼을 경우 MAX(earnings)는 earnings가 같은 데이터끼리 묶은 각 그룹 안에서 earnings의 최대값을 의미합니다.
그런데 earnings가 1000인 데이터끼리만 모인 그룹에서 최대값을 구하든 최소값을 구하든 1000이겠죠.
결국 HAVING 절의 의미가 1000 = 1000 인 경우를 구하라는 뜻, 즉 모든 데이터를 구하라는 뜻이 되어 모든 데이터가 조회되는 것입니다.
그룹별 MAX 값이 아니라 employee 테이블 전체에서의 MAX 값과 같은 데이터만 조회하고 싶은 것이므로HAVING earnings = (SELECT MAX(months * salary) FROM employee)
이렇게 수정해 주셔야 합니다.
서브쿼리(쿼리 안의 다른 쿼리)를 이용한 방법인데, 저희 커리큘럼에서는 서브쿼리를 고급반에서 다루고 있습니다.
중급반에서 공부하는 내용은 아니지만 더 알고 싶으시다면 MySQL 공식문서를 참고하시거나 구글링 해 보시길 권해 드려요!
답변 덕분에 의문점이 해결되었습니다. 감사합니다!