작성
·
257
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
절 이후에 해당 집계 함수에 의해 계산이 이루어집니다.도움이 되셨기를 바랍니다. 더 궁금한 점이 있으시면 언제든지 문의해 주세요!