• 카테고리

    질문 & 답변
  • 세부 분야

    데이터 분석

  • 해결 여부

    미해결

group by와 having 질문

22.03.09 14:51 작성 조회수 134

0

강의를 들으면 들을수록 그룹바이의 명확한 개념적 설명이 부족하다고 계속 느끼네요ㅠ

만약 job / salary / year  동시에 보여주는 테이블 company가 있다고  

질문 1. group by를 쓴 1번과 쓰지 않은 2번의 차이가궁금하고, 반드시 group by를 써야하는 때가 궁금합니다.

 

(1번) 

select job, avg(salary)

from company

group by job

 

(2번)

 

select job, avg(salary)

from company

 

 

 

질문 2.  having을 쓰는 1번과 where를 쓰는 2번의 차이가 뭔지 궁금합니다. having을 꼭 써야만 하고 where를 쓰지 못하는 상황 예시가 궁금해요.

(1번) 

select job, avg(salary)

from company

group by job
having year >= 3

 

(2번)

select job, avg(salary)

from company

where year >= 3

group by job

 

답변 1

답변을 작성해보세요.

0

company 테이블이 다음 예시와 같다고 가정하고 설명 드리겠습니다.

질문 1. group by를 쓴 (1)과 쓰지 않은 (2)의 차이, 반드시 group by를 써야하는 경우

(1)
select job, avg(salary)
from company
group by job

(2)
select job, avg(salary)
from company


GROUP BY은 어떤 기준으로 그룹을 묶어, 그 그룹에 해당하는 데이터의 통계량(평균, 합계 등)을 집계하기 위해 사용합니다. 

GROUP BY job 은 각 job 그룹의 평균을 구하겠다는 뜻이므로, 쿼리 (1)을 통해서는 DA의 평균 salary와 DE의 평균 salary를 알 수 있게 됩니다. 

DA | 60,000
DE | 65,000

쿼리 (2)로는 전체 데이터가 집계되기 때문에 여기 있는 5명 전체의 평균 salary 값(62,000)이 한 줄로 출력됩니다.
job이 무엇인지와 관계없이 전체에서 구한 평균값이기 때문에, SELECT 절에 job을 표기할 필요는 없습니다.

 

질문 2. having을 쓴 (1)과 where을 쓴 (2)의 차이, having을 꼭 써야만 하고 where을 쓰지 못하는 상황 예시 

(1)
select job, avg(salary)
from company
group by job
having year >= 3

(2)
select job, avg(salary)
from company
where year >= 3
group by job 

 

WHERE은 전체 데이터 중에서 특정 데이터들만 뽑아내기 위해서 사용합니다. 

'연차가 3년 이상인 직원들의 직군별 평균 연봉'을 구하는 것이 목적이라면 (2)와 같이 쓰시면 됩니다.

HAVING은 GROUP BY 절을 통해 연산한 결과물을 가지고 필터링하는 명령어인데, year는 GROUP BY 집계와 관계없는 컬럼이기 때문에 HAVING 절에 올 수 없으므로 쿼리 (1)은 작동이 되지 않습니다. 

우선 GROUP BY를 통해 job 별 평균 salary 값이 만들어 지고(질문 1-(1)에 대한 결과물을 참고해 주세요),
그 후에 '평균 salary가 60,000 보다 큰 경우만 출력'하는 등의 경우에 HAVING을 사용합니다.

SELECT job, avg(salary)
FROM company
GROUP BY job
HAVING avg(salary) > 60000