작성
·
891
2
SELECT MAX(salary * months), count(*)
From employee
GROUP BY salary * months
쿼리로 이렇게 짤 경우 가장 큰 값이 나오지 않고
Earnings 별로 인원수가 나오더라구요
max함수와 ORDER BY & LIMIT 함수 차이가 뭔지 궁금합니다.
답변 2
5
안녕하세요 learn&learn님 답변이 늦어 죄송합니다.
질문 주신 내용을 보니 쿼리 내에 문법적인 오류와 논리적인 오류가 동시에 들어있어서 분리하여 설명드려야 할 것 같아요 :)
1. GROUP BY 문법 오류
GROUP BY는 인터프리터에게 특정 기준을 주고 그 기준으로 데이터를 분류해서 연산을 하게끔 명령하는 명령어라고 할 수 있겠는데요. 따라서 해당 구문을 사용하실 때에는 GROUP BY의 기준이 되는 값(salary*months)을 반드시 SELECT 문에 지정해주고 그것을 기준으로 연산을 진행하셔야만 합니다.
따라서 수강생분께서 짜주신 쿼리에서 GROUP BY를 올바르게 사용하시려면 아래와 같은 쿼리로 변경을 해주셔야 하는데요. 그렇게 되면 MAX를 사용하신 이유가 없어집니다.
SELECT salary*months, MAX(salary*months), count(*)
FROM employee
GROUP BY salary*months
2. ORDER BY, LIMIT와 MAX의 차이점
ORDER BY, LIMIT 와 MAX는 언뜻 보기에는 비슷해보이고, 조건에 따라 동일한 결과값을 낼 때도 있지만 엄연하게 따지면 전혀 다른 매커니즘으로 동작하는 쿼리입니다. ORDER BY 와 LIMIT는 row 단위로 데이터를 확인하면서 가져오는 쿼리라면 MAX는 하나의 컬럼 내에서 가장 큰 하나의 값을 찾아내는 쿼리입니다.
즉, 테이블 내 한개의 컬럼에 대한 최소값, 최댓값을 구해야 할 경우 max와 order by, limit 1은 호환이 될 수 있으나. 그 이외의 경우에는 다르게 동작하게 됩니다.
3. MAX를 이용한 풀이는?
max를 이용하여 해당 문제를 풀기 위해서는 기본 쿼리로는 불가능하여 서브쿼리 등을 이용해야 하는데요. 궁금하신 경우 아래 쿼리를 참고해보시고 궁금한 점이 있으시면 다시 질문을 주시면 좋을 것 같습니다.
select max(salary*months), count(employee_id)
from employee
where salary*months in (select max(salary*months) from employee);
다시 한번 답변이 늦어져서 정말 죄송합니다.
좋은 질문 주셔서 감사합니다 :)
0