(DB실무) Part4-SQL 기본 및 활용-7.Multi-Row Function
2026년 11월 8일 공유
SQL 다중행 함수와 윈도우 함수
개요
다중행 함수는 여러 행 또는 행의 그룹을 대상으로 연산한다. 강의에서는 다중행 함수의 분류와 집계 함수,
GROUP BY·HAVING, 고급 집계 함수, PIVOT·UNPIVOT, 윈도우 함수의 사용법을 실습 중심으로 다룬다.핵심 개념
- 다중행 함수는 크게 그룹 함수와 윈도우 함수로 나뉜다.
- 그룹 함수는 여러 행을 집계해 결과를 반환한다. 집계 함수와 고급 집계 함수가 포함된다.
- 윈도우 함수는 여러 행을 참조하되, 각 행에 대한 순위·비율·주변 행과의 관계 등을 계산한다.
GROUP BY는 집계 기준을 정하고,HAVING은 집계 결과에 조건을 적용한다.
- SQL은 작성 순서와 실제 처리 순서가 다르므로, 절의 순서를 이해해야 올바른 결과를 얻을 수 있다.
상세 노트
1. 집계 함수
대표적인 집계 함수는 다음과 같다.
함수 | 기능 |
|---|---|
COUNT | 행 또는 값의 개수 |
SUM | 합계 |
AVG | 평균 |
MAX, MIN | 최댓값, 최솟값 |
STDDEV, VARIANCE | 표준편차, 분산 |
NULL과 중복 처리
- 대부분의 집계 함수는
NULL값을 제외하고 계산한다.
AVG는 값이 있는 행만 대상으로 평균을 구한다. 모든 입력값이NULL이면 결과는NULL이다.
COUNT(*)는 행 전체를 센다.COUNT(컬럼)은 해당 컬럼이NULL인 행을 제외한다.
COUNT(DISTINCT 컬럼)은 중복값을 하나로 간주해 종류 수를 센다.DISTINCT를 생략하면 기본적으로 중복을 허용한다.
MAX·MIN은 숫자뿐 아니라 문자와 날짜에도 사용할 수 있다. 문자 데이터는 정렬 순서, 날짜는 시간 순서를 기준으로 한다.
2. GROUP BY와 HAVING
GROUP BY는 데이터를 지정한 기준별로 묶어 집계한다. 예를 들어 부서별 인원수나 직무별 평균 급여를 구할 수 있다.
- 그룹 기준이 없으면 전체 행을 하나의 그룹으로 집계한다.
SELECT에는 집계 함수와GROUP BY에 사용한 컬럼을 둘 수 있다. 그룹 기준이 아닌 일반 컬럼을 함께 선택하면 오류가 발생한다. 전체 집계에서도 집계 함수가 아닌 컬럼은 선택할 수 없다.
WHERE는 행을 필터링하고,HAVING은 집계가 끝난 그룹을 필터링한다. 집계 함수 조건은WHERE가 아니라HAVING에 둔다.
- 그룹 기준을 여러 개 지정하면 각 기준의 조합별로 집계한다. 예를 들어 부서와 직무를 함께 지정하면 부서별·직무별 결과가 나온다.
3. SQL 처리 순서와 컬럼 범위
주요 절의 논리적 처리 순서는 다음과 같다.
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BYWHERE는 그룹화 전에 처리되므로 집계 함수 조건을 사용할 수 없다.
HAVING은 그룹화 후 집계 결과에 조건을 적용한다.
- 일반 테이블에서는
SELECT에 표시하지 않은 컬럼도WHERE,HAVING,ORDER BY에서 사용할 수 있다.
- 단, 인라인 뷰가 만들어지면 바깥 쿼리는 인라인 뷰의
SELECT에 포함된 컬럼만 사용할 수 있다. 필요한 컬럼은 인라인 뷰 안에서 선택해 바깥으로 전달해야 한다.
- 정렬 후 상위 몇 행을 구하려면 정렬과 행 제한의 처리 순서를 고려해야 한다. 먼저 행을 제한하고 나중에 정렬하면 전체에서 원하는 상위 행이 아닐 수 있으므로, 정렬된 인라인 뷰를 만든 뒤 바깥에서 행을 제한하는 방식이 필요하다.
4. 고급 집계 함수
ROLLUP
- 지정한 컬럼의 순서에 따라 계층적으로 집계한다.
- 전체 집계와 앞쪽 컬럼 기준의 소그룹 집계를 추가한다.
- 컬럼 순서가 결과에 영향을 준다. 예를 들어
ROLLUP(부서, 직무)는 전체, 부서별, 부서·직무별 집계를 제공하지만 직무별 집계는 별도로 만들지 않는다.
CUBE
- 지정한 컬럼들의 모든 가능한 조합에 대한 집계를 계산한다.
- 컬럼 순서에 영향받지 않지만, 조합이 많아질수록 계산량이 커진다.
GROUPING SETS
- 지정한 각 그룹 기준을 개별적으로 집계한다.
- 전체 집계나 기준 간 조합 집계는 자동으로 포함하지 않는다. 필요한 집계 기준을 직접 지정한다.
GROUPING
ROLLUP,CUBE,GROUPING SETS결과에서 해당 컬럼이 집계로 생략된 것인지 구분할 때 사용한다.
- 일반적으로 집계로 묶인 컬럼은
1, 개별 값으로 표시된 컬럼은0을 반환한다.
CASE와 함께 사용하면 집계 결과의NULL을 “전체” 같은 설명적인 값으로 바꿔 표시할 수 있다.
ROLLUP은 컬럼별GROUPING SETS와UNION을 조합해 표현할 수 있고,CUBE는 순서를 바꾼ROLLUP결과를 합쳐 구현할 수 있다.
5. PIVOT과 UNPIVOT
PIVOT은 행 데이터를 열로 펼친다. 특정 컬럼의 값들을 열 제목으로 만들고, 지정한 집계 함수의 결과를 채운다.
- 예를 들어 직무별 급여 합계를 직무 이름이 각각의 열로 표시되는 표로 변환할 수 있다.
- 피벗 기준 컬럼과 집계 대상 컬럼을 정한다. 그 외에 남는 컬럼이 그룹 기준이 된다.
UNPIVOT은 반대로 여러 열에 흩어진 값을 행 형태로 변환한다.
- 실무에서 유용하며, 스프레드시트의 행·열 전환 개념과 유사하다.
6. 윈도우 함수
윈도우 함수는 전체 결과를 한 행으로 축약하지 않고, 각 행을 유지하면서 관련 행들을 기준으로 값을 계산한다. 기본 구조는 다음과 같다.
함수(...) OVER ( PARTITION BY 기준컬럼 ORDER BY 정렬컬럼 윈도우_프레임)OVER가 윈도우 함수의 핵심 구문이다.
PARTITION BY는 계산 범위를 그룹별로 나눈다.GROUP BY와 달리 행을 하나로 축약하지 않는다.
ORDER BY는 순위나 행의 앞뒤 관계를 정한다.
- 윈도우 프레임은 현재 행을 기준으로 계산에 포함할 행의 범위를 지정한다. 행 수 기준은
ROWS, 값 범위 기준은RANGE를 사용한다. 예를 들어UNBOUNDED PRECEDING은 파티션의 첫 행부터 현재 행까지를 뜻한다.
순위 함수
RANK: 동점에 같은 순위를 주고, 다음 순위는 건너뛴다. 예:1, 2, 2, 4
DENSE_RANK: 동점에 같은 순위를 주되 순위를 건너뛰지 않는다. 예:1, 2, 2, 3
ROW_NUMBER: 각 행에 고유한 번호를 부여한다. 동점이어도 서로 다른 번호를 받는다.
ORDER BY정렬 방향에 따라 높은 값 또는 낮은 값의 순위가 달라진다.
집계 윈도우 함수와 프레임
SUM,AVG,COUNT,MIN,MAX등 집계 함수도OVER와 함께 사용할 수 있다.
PARTITION BY를 생략하면 전체 행이 계산 범위가 된다.
- 정렬 기준과 프레임을 함께 지정하면 현재 행 주변의 값만 집계할 수 있다.
ROWS는 행의 위치를 기준으로 범위를 정하고,RANGE는 정렬 값의 범위를 기준으로 한다.RANGE에서는 같은 정렬값을 가진 행들이 함께 계산될 수 있다.
행 순서 함수
FIRST_VALUE,LAST_VALUE: 정렬된 파티션의 첫 번째 또는 마지막 값을 반환한다.
LAG: 정렬 기준에서 앞선 행의 값을 가져온다.
LEAD: 정렬 기준에서 뒤에 있는 행의 값을 가져온다.
LAG·LEAD는 가져올 행이 없을 때 반환할 기본값을 지정해NULL을 대체할 수 있다.
비율 함수
RATIO_TO_REPORT: 파티션 내 전체 합계에서 현재 행의 값이 차지하는 비율을 계산한다.
PERCENT_RANK: 순위의 상대적 위치를 0부터 1까지의 비율로 나타낸다. 동점은 같은 낮은 백분율을 적용한다.
CUME_DIST: 누적 분포 비율을 계산한다.PERCENT_RANK와 달리 0을 포함하지 않으며, 동점에는 더 높은 백분율을 적용한다.
NTILE(n): 행을 개수 기준으로n개 그룹으로 나누고 각 행이 속한 그룹 번호를 반환한다. 균등하게 나누어떨어지지 않으면 앞쪽 그룹에 행이 더 배정된다.