본문 바로가기
[ CS 전공 ]

[ DB ] 7. SQL (2) : Group by, Having

by 불주먹고양이 2022. 4. 27.

1. Group by

(1) Aggregate functions - Group by

- 그룹화하여 데이터를 조회할 수 있도록 하는 operation

- 특정 column을 그룹화하는 것이다.

 

SELECT 컬럼 FROM 테이블 GROUP BY 컬럼;

 

ex. 각 학과의 교수들의 평균 연봉을 출력하시오.

select dept_name, avg(salary)
from instructor
group by dept_name;

- 이렇게 학과 별로 나누어진 salary들의 평균을 구하면 다음과 같다.

- relation의 통계 처리가 가능해진다.

 

 

(2) 주의사항

/* erroneous query */
select dept_name, ID, avg (salary)
from instructor
group by dept_name;

- 위의 sql query가 오류인 이유는, 학과 별로 그룹화 했을 때, 어느 한 ID가 그 그룹을 대표한다고 볼 수 없기 때문이다. 

- 따라서, ID는 빼주어야 한다. (학과를 대표하는 교수는 존재하지 않는다.)

 

 

 

2. Having

(1) Aggregate functions - Having Clause

- 컬럼을 그룹화한 후 조건 처리해주는 operation

SELECT 컬럼 FROM 테이블 GROUP BY 컬럼 HAVING 조건식;

 

- group by 절에서 조건을 주려면, where절이 아니라 having절을 써야 한다.

 

ex. 평균 연봉이 42000이 넘는 학과의 이름과 평균 연봉을 출력하시오

select dept_name, avg(salary) as avg_salary
from instructor
group by dept_name
having avg(salary) > 42000;

 

 

(2) 연산 해석 순서

from ▶ where ▶ group by ▶ having ▶ order by ▶ select

 

 

(3) Having과 Where의 차이

- Having : 특정 필드로 그룹화 되어진 새로운 테이블에 조건을 줄 수 있음 (그룹 필터링). group by 뒤에 위치. 

- Where : 기본적인 조건절로, 모든 필드를 대상으로 조건을 줄 수 있음 (행 필터링). group by 앞에 위치.

 

ex.

select name, count(*) as cnt
from 테이블
where age=20
group by name;

where 절 먼저 해석해서, 나이가 20인 사람들만을 추출한 후 이름을 기준으로 그룹화하여 count하는 방식이다.

 

select name, count(*) as cnt 
from 테이블 
group by name 
having count(*)>1;

이름을 기준으로 그룹화하고 그 그룹화된 결과를 바탕으로 2개 이상인 것만을 출력하는 방식이다.