본문 바로가기

데이터베이스(DB)

[DB/SQL] 6. 집계 함수(Aggregate Function), GROUP BY, HAVING

728x90
반응형

 

[목차]

 

1. 집계 함수(Aggregate Function)란?

 

2. COUNT

 

3. MIN / MAX

 

4. AVG / SUM

 

5. GROUP BY

 

6. HAVING

 

 

  1. 집계 함수(Aggregate Function)란?

 

집계 함수는 여러 행으로부터 하나의 결괏값을 반환하는 함수이다. SELECT 구문에서만 사용되며, 이전에 다룬 기본 함수들이 행(row)끼리 연산을 수행했다면, 집계 함수는 열(column)끼리 연산을 수행한다.

주로 평균, 합, 최대, 최소 등을 구하는 데 사용된다. 

 

 

위와 같이 테이블이 구성되어 있다고 가정하고, 집계 함수를 다루는 방법에 대해서 알아보자. 

 

 

  2. COUNT

 

COUNT특정 열(Column)의 행의 개수를 세는 함수이다. COUNT(*)로 작성하면 테이블에 존재하는 행의 개수가 반환되고, 특정 열에 대해서 COUNT를 수행하면 해당 열이 NULL이 아닌 행의 개수를 반환한다. 

 

mysql> SELECT COUNT(*) FROM tb;
mysql> SELECT COUNT(Name) FROM tb;
mysql> SELECT COUNT(Name) AS name_cnt FROM tb;
mysql> SELECT COUNT(Name) AS "name cnt" FROM tb;
mysql> SELECT COUNT(Job) FROM tb;

 

결과로 나온 열의 별칭을 지정하고 싶다면 AS 키워드를 이용한다. AS를 생략해도 된다.

띄어쓰기를 사용하고 싶다면 큰 따옴표("")를 사용해야 한다. 

아래는 코드를 실행한 결과이다. 

 

 

이전에 배운 DISTINCT 명령어를 이용하면 중복을 제외한 값의 개수를 구할 수도 있다. 

COUNT(DISTINCT column)의 형태로 사용한다. 

 

mysql> SELECT COUNT(DISTINCT Country) FROM tb;

 

중복을 제외하면 Country의 개수는 4개가 되는 것을 볼 수 있다. 

 

COUNT는 한번에 여러 열(Column)을 셀 수 없다. 따라서 여러 열을 세기 위해서는 COUNT를 각각 따로 이용해주어야 한다. 

 

 

 

  3. MIN / MAX

 

MINMAX최솟값과 최댓값을 구하는 함수이다. 

사용법은 위의 COUNT와 동일하다. 

 

mysql> SELECT MAX(Age) FROM tb;
mysql> SELECT MIN(Age) FROM tb;
mysql> SELECT MAX(Age) max_age FROM tb;

 

반드시 숫자 값에만 사용할 수 있는 것은 아니다. 문자 또는 문자열인 경우에는 MIN은 사전 순으로 가장 앞선 데이터, MAX는 사전 순으로 가장 느린 데이터를 반환한다. 

 

 

또한, MAX와 MIN 함수 내에 산술식을 사용할 수도 있다. 

아래와 같이 식을 계산한 결과를 기준으로 최댓값과 최솟값을 구해낸다. 

 

 

 

  4. AVG / SUM

 

AVG 함수는 선택한 열(Column)의 평균을 계산하며, SUM선택한 열(Column)의 합을 계산한다.

MIN/MAX와 다르게 숫자인 값에 대해서만 연산이 가능하며, NULL값은 무시하고 계산한다. 

따라서, NULL을 0으로 취급하여 평균을 구하고 싶다면 NULL을 0으로 지정하는 작업을 추가로 해야 한다. 

 

mysql> SELECT AVG(Age) FROM tb;
mysql> SELECT SUM(Age) FROM tb;

 

 

  5. GROUP BY

 

이전까지의 집계 함수는 테이블의 모든 행에 대해서 계산을 해주었다. 

GROUP BY 키워드를 이용하면 테이블의 일부 행을 대상으로 집계 함수를 사용할 수 있다.

 

mysql> SELECT Country, SUM(Age) FROM tb GROUP BY Country;

 

위와 같이 작성하면 각 나라별로 Age의 합을 구해주게 된다. 

 

 

즉, GROUP BY 뒤에 적은 열(Column) 값들로 그룹을 묶어서 각 그룹별로 SUM을 구해주는 방식이다. 

만약 GROUP BY Country, Name이라고 한다면 같은 나라와 같은 이름을 가진 행은 하나의 그룹으로 묶이게 된다. 

 

 

 

  6. HAVING

 

HAVING 절은 이전의 WHERE와 비슷하게 작용한다. 

GROUP BY와 함께 쓰이는 조건문이라고 생각하면 되는데, WHERE에서는 집계 함수를 사용할 수 없는 반면 HAVING은 집계 함수와 함께 사용 가능하다는 장점이 있다. 

 

mysql> SELECT Country, AVG(Age) FROM tb GROUP BY Country HAVING AVG(Age) >= 23;

 

위처럼 HAVING AVG(Age) >= 23을 추가하면 평균 나이가 23세 이상인 나라들만 선택해서 보여준다. 

 

 

728x90
반응형