집계 함수
이번에는 대표적인 집계 함수 COUNT, SUM, AVG, MIN, MAX와 GROUP BY를 사용하여 그룹화하는 방법을 알아보겠습니다.
SQL은 집합을 다루는 집계함수를 제공합니다. 일반적으로 함수는 파라미터로 하나의 값을 지정합니다. 하지만 집계함수의 경우는 파라미터로 집합을 지정합니다.
여기서 얘기하는 집계함수의 파라미터로 집합을 지정한다는 말이 쉽게 이해하기 어려울 수 있습니다. 이것에 대해서는 COUNT에서 한번 설명해 보겠습니다.
COUNT
COUNT 함수는 파라미터로 주어진 집합의 개수를 반환합니다.
1 | SELECT COUNT(컬럼명) FROM 테이블명 WHERE 조건식; |
[표 1. COUNT 함수의 사용 방법]
간단합니다. 뭘 어떻게 더 설명하기 어려울 정도로 간단합니다.
추가로 설명을 하면 COUNT 집계를 사용할때 컬럼의 값 중 NULL이 있을 경우 NULL은 포함하지 않습니다. 또한 중복 데이터의 경우는 별도로 중복제거를 하지 않는다면 포함하여 집계합니다.
그러면 중복을 제외하고 집계해야하는 상황에서는 어떻게 해야할까요?
DISTINCT를 지정한 컬럼은 중복값을 제외하고 결과를 반환하는 함수입니다.
그래서 DISTINCT를 사용한 결과를 집계 함수에 적용하면 중복값을 제거한 집계 결과를 확인할 수 있습니다.
1 | SELECT COUNT(DISTINCT 컬럼명) FROM 테이블명 WHERE 조건식; |
[표 2. DISTINCT 를 이용한 COUNT 함수 사용 방법]
SUM
집합 연산 중에서 합계를 구하기 위해 자주 사용하는 것이 SUM 함수입니다.
SUM 함수를 사용하면 지정한 컬럼의 합계를 구할 수 있습니다. 집계 가능한 범위는 수치형 데이터만 가능합니다. 문자열이나 날짜형의 데이터를 지정할 수 없습니다.
SUM도 COUNT와 마찬가지로 NULL 값을 제거한 뒤에 합계를 반환합니다.
1 | SELECT SUM(컬럼명) FROM 테이블명 WHERE 조건식; |
[표 3. SUM 함수 사용 방법]
AVG
평균값을 구하기 위해서는 SUM / COUNT 와 같이 지정하면 구할 수 있지만 굳이 저렇게 사용하지 않아도 간단히 평균값을 구할 수 있습니다. 바로 AVG 함수를 이용하면 됩니다. AVG 함수는 지정한 컬럼의 평균값을 구하는 함수로서 SUM과 마찬가지로 수치형만 가능합니다.
AVG 함수도 NULL값은 제거한 뒤에 계산을 합니다. 하지만 NULL을 0으로 간주해서 평균을 내고 싶다면 CASE를 이용해서 NULL을 0으로 변환한뒤 AVG를 사용하면 됩니다.
1 | SELECT AVG(컬럼명) FROM 테이블명 WHERE 조건식; |
[표 4. AVG 함수 사용 방법]
MIN / MAX
MIN, MAX 함수는 컬럼에서 최소값과 최대값을 구할 수 있습니다.
위의 다른 함수와 달리 문자열과 날짜형에도 사용할 수 있고 NULL 값은 무시합니다.
1 | SELECT MIN(컬럼명), MAX(컬럼명) FROM 테이블명; |
[표 5. MIN, MAX 함수 사용 방법]
GROUP BY
GROUP BY 에 컬럼을 지정하여 그룹화하면 지정된 컬럼의 값이 같은 레코드들이 하나의 그룹으로 묶입니다.
각 그룹에 묶인 값들은 동일합니다. 그래서 GROUP BY를 사용하면 DISTINCT와 같이 중복을 제거하는 효과가 있습니다.
그렇다면 DISTINCT와 GROUP BY는 무슨 차이가 있을까요?
두가지 함수 모두 중복값을 제거 한다는것은 동일하지만 GROUP BY는 집계 함수와 쓰이지 않으면 별 의미가 없습니다. GROUP BY로 그룹화하고 각각의 그룹을 집계 함수에서 파라미터로 사용해야 GROUP BY가 의미가 있습니다.
1 | SELECT SUM(컬럼명) FROM 테이블명 GROUP BY 컬럼명; |
[표 6. GROUP BY 사용 방법]
HAVING
그러면 그룹화를 시키고 집계 함수를 사용할 때 WHERE 구의 조건식에는 집계 함수를 사용할 수는 없을까요? 네 없습니다. 그룹화가 필요한 집계 함수는 WHERE 구에서 지정할 수 없습니다.
이게 무슨 말일까요 아래 표를 보고 설명 드리겠습니다.
1 | SELECT SUM(컬럼명) FROM 테이블명 WHERE COUNT(컬럼명) = 1 GROUP BY 컬럼명; |
[표 7. WHERE 구에서 집계 함수 사용]
[표 7]에서 사용한 문법 사용대로 한다면 에러가 발생합니다.
그 이유는 GROUP BY와 WHERE 구의 처리 순서 때문입니다. WHERE 구의 처리는 GROUP BY 보다 빠릅니다. 그래서 그룹화가 되기전에 조건절에서 컬럼을 집계하려고 하면 에러가 발생하는 것입니다.
쿼리의 내부처리 순서를 다시 한번 살펴 보겠습니다.
순위 | 구 |
1 | WHERE |
2 | GROUP BY |
3 | SELECT |
4 | ORDER BY |
[표 8. 쿼리의 내부 처리 순서]
지금까지 HAVING을 설명하기전 다른것은 왜 안되는지에 대해 먼저 살펴 보았습니다.
우리가 원하는대로 집계한 결과에서 조건에 맞는 값을 가져오기 위해서는 HAVING을 사용하면 됩니다.
HAVING은 GROUP BY 구 뒤에 기술하고 WHERE와 동일하게 조건식 지정이 가능합니다. 즉, 그룹화된 컬럼을 이용하여 조건식에서 집계 함수를 사용할 수 있다는 것입니다.
[표 8]에서 설명한 쿼리의 내부처리 순서에 HAVING이 들어간다면 2번째인 GROUP BY 다음에 들어가게 됩니다.
순위 | 구 |
1 | WHERE |
2 | GROUP BY |
3 | HAVING |
4 | SELECT |
5 | ORDER BY |
[표 9. HAVING을 추가한 쿼리의 내부 처리 순서]
1 | SELECT SUM(컬럼명) FROM 테이블명 GROUP BY 컬럼명 HAVING COUNT(컬럼명) = 식; |
[표 10. HAVING을 이용한 조건식 사용법]
'IT > Database' 카테고리의 다른 글
05.02. 집계와 서브쿼리 - 서브쿼리 (0) | 2017.02.28 |
---|---|
04. 데이터의 추가, 삭제, 갱신 (0) | 2017.02.21 |
03.02. 정렬과 연산 - 연산 (0) | 2017.02.20 |
03.01. 정렬과 연산 - 정렬 (0) | 2017.02.17 |
02.04. 테이블에서 테이터 검색 - 검색 조건 조합 및 패턴 매칭 (0) | 2017.02.16 |