데이터베이스
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절을 사용한다.
- 각 학과에 소속된 교수의 수
학과별로 소속된 교수끼리 group을 만든 후 group별로 처리해준다. Group by 다음에는 그룹을 만들 기준 속성이 온다.Select deptName, count(*) From professor Group by deptName;
- 각 학과 교수들의 평균 연봉
학과(deptName)에 따라 교수를 grouping하고 deptName과 연봉의 평균을 출력한다.Select deptName, avg(salary) From professor Group by 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