SQL 기본 및 활용 - GROUP BY, HAVING 절
1. 집계 함수
여러 행들의 그룹이 모여서 그룹당 단 하나의 결과를 돌려주는 다중행 함수 중 집계 함수의 특성은 다음과 같다.
- 여러 행들의 그룹이 모여서 그룹당 단 하나의 결과를 돌려주는 함수이다
- GROUP BY 절은 행들을 소그룹화 한다
- SELECT 절, HAVING 절, ORDER BY 절에 사용할 수 있다
집계 함수명 ([DISTINCT|ALL]칼럼이나 표현식)
#ALL은 default 옵션이므로 생략 가능함, DISTINCT는 같은 값을 하나의 데이터로 간주할 때 사용하는 옵션임
2 & 3. GROUP BY 절 & HAVING 절
SELECT [DISTINCT] 칼럼명 [ALIAS명] FROM 테이블명 [WHERE 조건식][GROUP BY 칼럼이나 표현식][HAVING 그룹조건식];
GROUP BY 절과 HAVING 절은 다음과 같은 특성을 가진다.
- GROUP BY 절을 통해 소그룹별 기준을 정한 후, SELECT절에 집계 함수를 사용한다
- 집계 함수의 통계 정보는 NULL 값을 가진 행을 제외하고 수행한다.
- GROUP BY 절에서는 SELECT 절과는 달리 ALIAS 명을 사용할 수 없다
- 집계 함수는 WHERE 절에는 올 수 없다 (집계 함수를 사용할 수 있는 GROUP BY 절보다 WHERE 절이 먼저 수행된다)
- WHERE 절은 전체 데이터를 GROUP으로 나누기 전에 행들을 미리 제거시킨다
- HAVING 절은 GROUP BY 절의 기준 항목이나 소그룹의 집계 함수를 이용한 조건을 표시할 수 있다
- GROUP BY 절에 의한 소그룹별로 만들어진 집계 데이터 중, HAVING 절에서 제한 조건을 두어 조건을 만족하는 내용만 출력한다
- HAVING 절은 일반적으로 GROUP BY 절 뒤에 위치한다.
4. CASE 표현을 활용한 월별 데이터 집계
"집계 함수(CASE())~GROUP BY" 기능은 모델링의 제1정규화로 인해 반복되는 칼럼의 경우 구분 칼럼을 두고 여러개의 레코드로 만들어진 집합을, 정해진 칼럼 수만큼 확장해서 집계 보고서를 만다는 유용한 기법이다.
DECODE 함수를 사용함으로써 SQL 문장이 조금 더 짧아졌다.
CASE 표현과 Oracle의 DECODE 함수는 표현상 서로 장단점이 있으므로 어떤 기능을 선택할지는 사용자의 몫이다.
5. 집계 함수와 NULL
리포트의 빈칸을 NULL이 아닌 ZERO로 표현하기 위해 NVL(Oracle)/ISNULL(SQL Server) 함수를 사용하는 경우가 많은데, 다중 행 함수를 사용하는 경우는 오히려 불필요한 부하가 발생하므로 굳이 NVL 함수를 다중행 함수 안에 사용할 필요가 없다.
리포트 출력 때 NULL이 아닌 0을 표시하고 싶은 경우에는 NVL(SUM(SAL),0)이나, ISNULL(SUM(SAL),0)처럼 전체 SUM의 결과가 NULL인 경우 (대상 건수가 모두 NULL인 경우)에만 한번 NVL/ISNULL 함수를 사용하면 된다.
글에서 나오는 코드와 내용은 책 SQL 전문가 가이드에서 가져옴을 알립니다.