Skip to content

SQL 집계 함수 해설

SQL 집계 함수, GROUP BY, HAVING, 그리고 distinct/고급 집계를 반환값과 orders 테이블의 한 줄 예시에 매핑하여 정리했습니다.

집계 함수는 여러 행을 하나의 스칼라 결과로 묶습니다. GROUP BY는 집계 전에 키 기준으로 행을 분할합니다. HAVING은 집계 후에 그룹을 필터링합니다. NULL 입력은 COUNT(*)를 제외한 모든 집계에서 건너뜁니다.

참고 표 · 29 항목
29 of 29 rows
스칼라
NULL이 아닌 입력값의 개수. COUNT(*)는 모든 행을 셉니다.SELECT COUNT(*) FROM orders
NULL이 아닌 숫자 값의 합계. 빈 집합에서는 NULL을 반환합니다.SELECT SUM(total) FROM orders
NULL이 아닌 숫자 값의 산술 평균. NULL 입력은 무시합니다.SELECT AVG(total) FROM orders
비교 가능한 모든 타입에서 NULL이 아닌 가장 작은 값.SELECT MIN(total) FROM orders
비교 가능한 모든 타입에서 NULL이 아닌 가장 큰 값.SELECT MAX(total) FROM orders
그룹화
입력 행을 키 기준으로 분할하며, 집계는 파티션별로 실행됩니다.SELECT user_id, SUM(total) FROM orders GROUP BY user_id
집계 후 그룹별로 평가되는 조건자. 집계에는 WHERE 대신 씁니다.SELECT user_id, COUNT(*) FROM orders GROUP BY user_id HAVING COUNT(*) > 5
한 번의 패스로 그룹별 여러 집계를 계산합니다.SELECT user_id, COUNT(*), SUM(total), AVG(total) FROM orders GROUP BY user_id
하나의 문에서 여러 그룹화를 계산합니다. 현재 집합 밖의 키는 NULL을 반환합니다.SELECT user_id, region, SUM(total) FROM orders GROUP BY GROUPING SETS ((user_id), (region), ())
계층 기반 그루핑 세트의 축약형. 소계와 총계를 추가합니다.SELECT region, user_id, SUM(total) FROM orders GROUP BY ROLLUP (region, user_id)
나열한 키의 모든 조합을 그루핑 세트로 만드는 축약형.SELECT region, user_id, SUM(total) FROM orders GROUP BY CUBE (region, user_id)
일반 그룹 키와 그루핑 세트를 하나의 절에서 섞습니다.SELECT user_id, region, SUM(total) FROM orders GROUP BY user_id, GROUPING SETS ((region), ())
정렬 순서에서 키별 첫 번째 행을 유지합니다. Postgres 확장입니다.SELECT DISTINCT ON (user_id) user_id, total FROM orders ORDER BY user_id, created_at DESC
Distinct와 고급
고유한 NULL 아닌 값의 개수. 먼저 중복을 제거합니다.SELECT COUNT(DISTINCT user_id) FROM orders
제한된 오차로 distinct 값 개수를 추정합니다. 대규모 입력용입니다.SELECT APPROX_COUNT_DISTINCT(user_id) FROM orders
NULL이 아닌 문자열을 구분자로 연결합니다.SELECT STRING_AGG(user_id::text, ',') FROM orders
NULL이 아닌 문자열을 연결합니다. STRING_AGG의 MySQL 이름입니다.SELECT GROUP_CONCAT(user_id SEPARATOR ',') FROM orders
NULL이 아닌 입력값을 배열로 수집합니다.SELECT ARRAY_AGG(total) FROM orders
입력 행을 JSON 배열로 수집합니다. JSONB 형식은 파싱된 바이너리로 저장합니다.SELECT JSONB_AGG(user_id) FROM orders
모든 / 어느 하나의 NULL 아닌 입력값이 참이면 TRUE.SELECT BOOL_AND(total > 0), BOOL_OR(total > 100) FROM orders
BOOL_AND의 표준 별칭.SELECT EVERY(total > 0) FROM orders
정렬된 입력 위의 보간 / 최근접 순위 백분위수. WITHIN GROUP가 필요합니다.SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY total) FROM orders
가장 자주 나오는 입력값. Postgres의 순서 집합 집계입니다.SELECT MODE() WITHIN GROUP (ORDER BY total) FROM orders
정렬 순서를 순서 집합 및 가상 집합 집계에 전달합니다.SELECT RANK(500) WITHIN GROUP (ORDER BY total) FROM orders
집계를 조건을 통과하는 행으로 제한합니다.SELECT COUNT(*) FILTER (WHERE total > 100) FROM orders
집계가 값을 연결하거나 수집하기 전에 정렬합니다.SELECT STRING_AGG(user_id::text, ',' ORDER BY user_id) FROM orders
COUNT(*)와 COUNT(1)는 모든 행을 세고, COUNT(col)는 NULL 입력을 건너뜁니다.SELECT COUNT(*), COUNT(total), COUNT(1) FROM orders
NULL이 아닌 숫자 값의 표본 표준편차. STDDEV_POP가 모집단 형식을 주며, 기본 이름의 기본값은 엔진마다 다릅니다.SELECT STDDEV(total) FROM orders
NULL이 아닌 숫자 값의 표본 분산(STDDEV의 제곱). VAR_SAMP와 VAR_POP가 각 형식을 명명합니다.SELECT VARIANCE(total) FROM orders