1. 집계 함수
- 여러 행들의 그룹이 모여서 그룹당 단 하나의 결과를 돌려주는 다중행 함수 중 집계함수 (Aggregate Function)의 특성은 다음과 같음
- 여러 행들의 그룹이 모여 그룹당 단 한의 결과를 돌려주는 함수
- GROUP BY 절은 행동을 소그룹화시킴
- SELECT 절, HAVING 절, ORDER BY 절에 사용할 수 있음
집계함수명 ( [DISTINCT | ALL] 칼럼이나 표현식 )
- 집계함수명에 사용되는 두 가지 옵션에 대한 설명은 다음과 같음
- ALL: Default 옵션이므로 생략 가능
- DISTICNT: 같은 값을 하나의 데이터로 간주할 때 사용하는 옵션
- 자주 사용되는 주요 집계함수는 다음과 같음
- 집계함수는 그룹에 대한 정보를 제공하므로 주로 숫자 유형에 사용되지만
- MAX, MIN, COUNT 함수는 문자 및 날짜 유형에도 적용 가능한 함수
2. GROUP BY 절
- GROUP BY 절은 SQL 문에서 FROM 절과 WHERE 절 뒤에 오며, 데이터들을 작은 그룹으로 분류해 소그룹에 대한 항목별로 통계 정보를 얻을 때 추가로 사용
- GROUP BY 절과 HAVING 절은 다음과 같은 특성을 가짐
- GROUP BY 절을 통해 소그룹별 기준을 정한 후, SELECT 절에 집계함수를 사용
- 집계함수의 통계 정보는 NULL 값을 가진 행을 제외하고 수행함
- GROUP BY 절에서는 SELECT 절과는 달리 ALIAS 명을 사용할 수 없음
- 집계함수는 WHERE 절에는 올 수 없음
- WHERE 절은 전체 데이터를 GROUP으로 나누기 전에 행들을 미리 제거함
- HAVING 절은 GROUP BY 절의 기준 항목이나 소그룹의 집계함수를 이용한 조건을 표시할 수 있음
- GROUP BY 절에 의한 소그룹별로 만들어진 집계 데이터 중, HAVING 절에서 제한 조건을 두어 조건을 만족하는 내용만 출력
- HAVING 절은 일반적으로 GROUP BY 절 뒤에 위치함
3. HAVING 절
- WHERE 절은 FROM 절에 정의된 집합 (주로 테이블)의 개별 행에 WHERE 절의 조건절이 먼저 적용되고, WHERE 절의 조건에 맞는 행이 GROUP BY 절의 대상이 됨
- 그런 다음 결과 집합의 행에 HAVING 조건절이 적용되며 결과적으로 HAVING 절의 조건을 만족하는 내용만 출력됨
- 즉 HAVING 절은 WHERE 절과 비슷하지만 그룹을 나타내는 결과 집합의 행에 조건이 적용된다는 점에서 차이가 있음
- 가능하면 WHERE 절에서 조건절을 적용해 GROUP BY의 계산 대상을 줄이는 것이 효율적인 자원 활용 측면에서 바람직함
4. CASE 표현을 활용한 월별 데이터 집계
- `집계함수(CASE()) ~ GROUP BY` 기능은 모델링의 제1정규화로 인해 반복되는 칼럼의 경우 구분 칼럼을 두고 여러 개의 레코드로 만들어진 집합을 정해진 칼럼 수만큼 확장해 집계 보고서를 만드는 유용한 기법
STEP 1. 개별 데이터 확인
- 먼저 개별 입사정보에서 월별 데이터를 추출하는 작업을 진행
- 해당 단계는 월별 정보가 있다면 생략 가능
STEP 2. 월별 데이터 구분
- 추출된 MONTH 데이터를 Simple Case Expression을 이용해 12개의 월별 칼럼으로 구분함
STEP 3. 부서별 데이터 집계
- 최종적으로 보여주는 리포트는 부서별로 월별 입사자의 평균 급여를 알고 싶다는 요구 사항이므로 부서별 평균값을 구하기 위해 GROUP BY 절과 AVG 집계함수를 사용
5. 집계함수와 NULL 처리
- 리포트의 빈칸을 NULL이 아닌 ZERO로 표현하기 위해 NVL/ISNULL 함수를 사용하는 경우가 많지만 다중 행 함수를 사용하는 경우는 오히려 불필요한 부하가 발생하므로 지양해야 함
- 다중 행 함수는 입력 값으로 전체 건수가 NULL 값인 경우만 함수의 결과가 NULL이 나오고 전체 건수 중에서 일부만 NULL인 경우는 NULL인 행을 다중 행 함수의 대상에서 제외함
- CASE 표현 사용 시 ELSE 절을 생략하게 되면 Default 값이 NULL
- NULL은 연산의 대상이 아닌 반면, `SUM (CASE MONTH WHEN 1 THEN SAL ELSE 0 END)`처럼 ELSE 절에서 0을 지정하면 불필요하게 0이 SUM 연산에 사용되므로 자원 사용이 많아짐
- 같은 결과를 얻을 수 있다면, 가능한 ELSE 절에 상수값을 지정하지 않거나 ELSE 절을 작성하지 않는 것을 권장
- 같은 이유로 Oracle의 DECODE 함수는 네 번째 인자를 지정하지 않으면 NULL이 Default로 할당됨
- 많이 실수하는 것 중 하나가 Oracle의 SUM (NVL (SAL, 0)), SQL Server의 SUM (ISNULL, (SAL, 0)) 연산과 같이 불필요하게 NVL, ISNULL 함수를 사용해 0으로 변환시켜 데이터 건수만큼의 연산이 일어나도록 하여 시스템의 자원을 낭비하는 케이스
- 리포트 출력 때 NULL이 아닌 0을 표시하고 싶은 경우에는 NVL (SUM (SAL), 0)이나 ISNULL (SUM (SAL), 0)처럼 전체 SUM의 결과가 NULL인 경우에만 한 번 NVL.ISNULL 함수를 사용하면 됨
참고
SQL 전문가 가이드 2020 개정판 - 한국데이터산업진흥원
반응형
'DB > SQL 전문가 가이드' 카테고리의 다른 글
[과목 II 1장 7절] 조인 (0) | 2025.03.25 |
---|---|
[과목 II 1장 6절] ORDER BY절 (0) | 2025.03.24 |
[과목 II 1장 4절] WHERE 절 (0) | 2025.03.23 |
[과목 II 1장 3절] 함수 (0) | 2025.03.22 |
[과목 II 1장 2절] SELECT 문 (0) | 2025.03.22 |