데이터베이스

SQL7: Aggregation Function(집계함수), Group By, Having

소재훈 2021. 12. 23. 17:58

데이터베이스 목차

이 글에서는 University Database가 사용된다.

 

집계 함수는 통계 데이터를 다루는 경우 주로 사용하면 SQL에서는 기본적으로 5개의 집계 함수를 지원한다.

  • avg: 평균
  • min: 최소값
  • max: 최댓값
  • sum: 합계
  • count: 개수

주로 Select 절과 Where절에서 집계함수를 주로 사용한다. 예시 몇가지를 살펴보자.

  • 학생(student)테이블의 tuple개수를 구하라.
    Select count(*)
    From student;​
     
  • CS학과에 소속된 교수(professor)의 평균, 최소, 최대 연봉
    Select avg(salary), max(salary), min(salary)
    From professor
    Where deptName = 'CS';​
  • 2010년 봄학기에 강의한 교수의 수를 구해라. 여러강의를 한 교수는 한번만 카운팅한다.
    Select count(distinct pID)
    From teaches
    Where semester = 'Spring' and year = 2010;​
     

Group By절

Grouping을 통해서 통계 값을 구하고자 할 때 group by절을 사용한다.

  • 각 학과에 소속된 교수의 수
    Select deptName, count(*)
    From professor
    Group by deptName;​
    학과별로 소속된 교수끼리 group을 만든 후 group별로 처리해준다. Group by 다음에는 그룹을 만들 기준 속성이 온다.
  • 각 학과 교수들의 평균 연봉
    Select deptName, avg(salary)
    From professor
    Group by deptName;​
    학과(deptName)에 따라 교수를 grouping하고 deptName과 연봉의 평균을 출력한다.

Group by절에는 Select 절에서 집계함수를 제외한 모든 속성이 나와야 한다. 다음과 같이 Select 절에는 써주었지만 Group By절에 써주지 않으면 안된다.

Select deptName, pID, avg(salary)
From professor
group by deptName;

학과, 교수별로 평균연봉을 구한 SQL문인데, Group By절에 pID가 없어 그룹핑을 했을 때 결과테이블을 만들어 낼 수 없다.


Having절

having절은 Where절과 비슷하게 조건에 맞는 튜플을 찾아내는 역할을 한다. Having절은 반드시 Grouping을 한 이후에 오는 조건문을 체크하는 것이고, Where절은 Grouping 전에 수행된다는 차이점이 있다.

ex) 평균 연봉이 6900보다 큰 학과명과 평균 연봉을 출력하라.

Select deptName, avg(salary)
From professor
Group by deptName
having avg(salary) > 6000;

위와 같이 having절을 사용해서 조건문을 줄 수 있다.


집계함수와 Null

집계함수에서는 null을 어떻게 다루고 있는지 알아보자.

기본적으로 null value를 무시하나, 예외적으로 count(*)는 tuple의 수를 카운팅하는 것이기 때문에 무시하지 않는다. count(*)를 제외한 모든 집계함수(Aggregation Fucntion)에서는 null을 무시한다.

  • SELECT count(hourWage) FROM mytable; -> 2
  • SELECT count(distinct hourWage) FROM mytable; -> 2
  • SELECT sum(hourWage) FROM mytable; -> 11,000
  • SELECT hourWage, count(*) FROM mytable GROUP BY hourWage; 
    5000 1
    6000 1
    null 2
    hourWage 속성으로 그룹을 만들었을 때 null값도 하나의 값도 취급받는 것을 확인할 수 있다.