인프런 커뮤니티 질문&답변
해커랭크 Top earners
작성
·
259
1
해커랭크 top earners 문제 질문입니다.
강의에서 풀어주신 코드입니다.
SELECT salary * months AS earnings, COUNT(* )
FROM Employee
GROUP BY earnings
ORDER BY earnings DESC
LIMIT 1;
108064 7
제가 따로 혼자 풀어보다가 몇가지 궁금한 점이 생겼는데요.
SELECT (months * salary) AS earnings, COUNT(*)
FROM Employee
GROUP BY (months * salary) AS earnings
ORDER BY (months * salary) AS earnings DESC
LIMIT 1 ;
이 코드는 왜 안되는 걸까요?
LIMIT 다음에 COUNT(*) 코드가 실행되서 그런건가요?
GROUP BY 명령어 바로 뒤에는 (months * salary) AS earnings 와 같은 계산식이 들어가면 안되나요?
3.
그리고 제가 이전에 이 문제 관련해서
SELECT MAX(salary * months AS earnings) , COUNT(*)
FROM Employee
GROUP BY earnings; 는 왜 안되는지 질문을 한적이 있었습니다.
그런데 답변에서
SELECT MAX(months * salary) AS max_earnings, COUNT(*)
FROM Employee
이렇게 코드를 바꾸면 실행될거라고 답변이 달렸는데요.
코드 복사해서 실행해보니 정답이 나오지 않습니다.
SELECT salary * months AS earnings, COUNT(* )
FROM Employee
GROUP BY earnings
ORDER BY earnings DESC
LIMIT 1;
마지막으로 강사님께서 풀어주신 코드 중 SELECT salary * months AS earnings -> FROM -> GROUP BY -> ORDER BY -> LIMIT -> COUNT 순으로 명령어가 읽히는게 맞죠?
순서가 너무 헷갈리네요...
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
ljsuu96331님의 궁금증을 하나씩 해결해 보겠습니다.
- 첫번째 코드에서는
GROUP BY및ORDER BY절에AS키워드를 사용하는 것이 잘못되었습니다.AS키워드는 별칭(Alias)을 부여할 때 사용하는 것이며,GROUP BY와ORDER BY절에는 직접 계산식을 사용하거나, 이미 정의된 별칭을 사용해야 합니다. 따라서 아래와 같이 수정할 수 있습니다.
SELECT (months * salary) AS earnings, COUNT(*)
FROM Employee
GROUP BY (months * salary)
ORDER BY earnings DESC
LIMIT 1;
GROUP BY절 바로 뒤에는 별칭을 새로 정의할 수 없습니다. 이미 SELECT 절에서 정의된 별칭을 사용하거나 직접 계산식을 넣어야 합니다.MAX 함수는 그룹의 최댓값을 반환하므로,
GROUP BY와 함께 사용되어서는 안 됩니다. 대신, 결과를 필터링하기 위해ORDER BY와LIMIT를 사용하여 최댓값을 찾아야 합니다. 따라서 다음과 같이 코드를 수정할 수 있습니다.
SELECT salary * months AS earnings, COUNT(*)
FROM Employee
GROUP BY earnings
ORDER BY earnings DESC
LIMIT 1;
그리고 SQL 명령어가 실행되는 순서는 다음과 같습니다:
FROM절에서 데이터를 가져옵니다.
GROUP BY절로 데이터를 그룹화합니다.
SELECT절로 데이터에 대한 처리(계산, 별칭 부여 등)를 수행합니다.
ORDER BY절로 결과를 정렬합니다.
LIMIT절로 결과의 범위를 제한합니다.
- 만약
SELECT절에 집계 함수(COUNT, SUM 등)가 사용된 경우,GROUP BY절 이후에 해당 집계 함수에 의해 계산이 이루어집니다.
도움이 되셨기를 바랍니다. 더 궁금한 점이 있으시면 언제든지 문의해 주세요!




