1. 집계 함수(Aggregate Function)의 개념
집계 함수(Aggregate Function)는 SQL에서 여러 개의 값을 하나의 요약된 값으로 집계해주는 함수이다. 단일 행을 다루는 일반 연산자와는 달리, 집합 전체를 대상으로 통계값을 산출한다. SQL에서 제공하는 대표적인 집계 함수는 다음과 같다.
함수명 | 설명 |
COUNT() | 행의 개수를 센다 |
SUM() | 합계를 구한다 |
AVG() | 평균을 구한다 |
MAX() | 최대값을 구한다 |
MIN() | 최소값을 구한다 |
1-1. 예시 1: 전체 고객 수 구하기
SELECT COUNT(*) FROM customers;
1-2. 예시 2: 총 매출액 구하기
SELECT SUM(amount) FROM orders;
1-3. 예시 3: 평균 나이 구하기
SELECT AVG(age) FROM users;
1-4. 예시 4: 최고 가격의 상품
SELECT MAX(price) FROM products;
1-5. 예시 5: 가장 싼 상품 가격
SELECT MIN(price) FROM products;
집계 함수는 보통 SELECT 절에서 사용되며, GROUP BY 또는 HAVING과 함께 사용하면 다수의 그룹별 통계도 계산 가능하다.
2. GROUP BY: 행들을 묶어 그룹별로 요약하기
GROUP BY는 집계 함수와 함께 사용되어, 특정 컬럼의 값을 기준으로 데이터를 그룹화한다. 즉, 같은 값을 가진 행들을 하나의 그룹으로 묶고, 그 그룹별로 COUNT, SUM, AVG 등을 계산할 수 있다.
2-1. 기본 문법
SELECT 그룹기준컬럼, 집계함수 FROM 테이블명 GROUP BY 그룹기준컬럼;
2-2. 예시 1: 지역별 고객 수
SELECT city, COUNT(*) AS customer_count FROM customers GROUP BY city;
→ 고객 테이블을 도시(city)별로 나누고, 각 도시마다 고객 수를 센다.
2-3. 예시 2: 카테고리별 평균 가격
SELECT category_id, AVG(price) AS avg_price FROM products GROUP BY category_id;
→ 상품을 카테고리별로 묶고 평균 가격을 계산한다.
GROUP BY는 일종의 분류 및 요약 처리 도구이며, 데이터 시각화, 대시보드, 통계 리포트에 필수로 사용된다.
3. HAVING: 그룹화된 결과에 조건 걸기
HAVING은 WHERE과 비슷하지만, GROUP BY 이후 그룹 단위의 결과에 조건을 부여할 때 사용된다. 즉, WHERE는 행 단위 조건, HAVING은 그룹 단위 조건이다.
3-1. 예시 1: 주문 건수가 5건 이상인 고객만 조회
SELECT customer_id, COUNT(*) AS order_count FROM orders GROUP BY customer_id HAVING COUNT(*) >= 5;
3-2. 예시 2: 카테고리별 평균 가격이 1만 원 이상인 경우
SELECT category_id, AVG(price) AS avg_price FROM products GROUP BY category_id HAVING AVG(price) >= 10000;
3-3. WHERE vs HAVING 차이점
구문 | 적용 시점 | 대상 |
WHERE | 그룹화 이전 | 행(row) |
HAVING | 그룹화 이후 | 그룹(group) |
예를 들어, 특정 카테고리만 보고 싶다면 WHERE category_id = 3을 쓰고, 평균 가격이 1만 원 이상인 카테고리만 보고 싶다면 HAVING AVG(price) > 10000을 써야 한다.
4. 실무 예제 모음: 집계 쿼리 실전 적용
4-1. 실무 1: 관리자 화면에서 사용자 가입 통계
SELECT DATE(created_at) AS join_date, COUNT(*) AS new_users FROM users GROUP BY DATE(created_at) ORDER BY join_date DESC;
4-2. 실무 2: 월별 매출액 비교
SELECT DATE_FORMAT(order_date, '%Y-%m') AS month, SUM(amount) AS monthly_sales FROM orders GROUP BY month ORDER BY month ASC;
4-3. 실무 3: 가장 많이 팔린 상품 5개
SELECT product_id, COUNT(*) AS sale_count FROM order_items GROUP BY product_id ORDER BY sale_count DESC LIMIT 5;
→ TOP 5 베스트셀러 상품을 도출한다.
5. 집계함수와 DISTINCT의 조합
집계 함수는 DISTINCT와 함께 사용하면 중복을 제거한 후 계산이 가능하다.
5-1. 예시: 중복 없이 고객 수 세기
SELECT COUNT(DISTINCT customer_id) AS unique_customers FROM orders;
→ 주문이 여러 건이어도, 고객 수는 중복 없이 계산
5-2. 예시: 카테고리별 고유 상품 수
SELECT category_id, COUNT(DISTINCT product_id) AS product_count FROM products GROUP BY category_id;
→ 같은 상품이 여러 번 등록되어 있더라도, 고유한 상품 수만 센다
DISTINCT는 데이터의 고유 항목 개수, 즉 “실제 몇 명의 유저가 있었는가”, “중복 없이 몇 개의 제품이 팔렸는가” 같은 질문에 대답할 때 매우 유용하다.
6. GROUP BY 없이 집계함수만 사용하는 경우
꼭 GROUP BY와 함께 집계 함수를 사용해야 하는 것은 아니다. 전체 테이블의 통계를 알고 싶을 때는 단독으로 사용해도 된다.
6-1. 예시: 전체 매출 합계
SELECT SUM(amount) AS total_sales FROM orders;
6-2. 예시 : 고객 수
SELECT COUNT(*) FROM customers;
6-3. 예시: 전체 평균 나이
SELECT AVG(age) FROM users;
이런 방식은 통합 수치, 전반적 지표, 대시보드 상단 요약 정보 등을 만들 때 많이 사용된다. 특히 실무에서 대시보드 상단에 “총 매출”, “총 사용자 수”, “오늘 가입자” 등 집계를 표현할 때 꼭 필요하다.
7. 주의사항 및 최적화 팁
- GROUP BY에 SELECT에 없는 컬럼을 넣으면 오류 발생
→ SELECT에 포함되지 않은 컬럼은 반드시 집계 함수로 묶어야 한다 - NULL 값이 있는 경우
→ NULL도 하나의 그룹으로 처리된다 - HAVING 절은 성능에 영향을 줄 수 있음
→ 가능하면 WHERE로 먼저 필터링해서 불필요한 데이터 제거 후 GROUP BY 사용 - 집계 함수는 JOIN된 테이블에서도 활용 가능
→ INNER JOIN + GROUP BY는 실무 통계의 핵심 패턴 - 인덱스 활용이 제한됨
→ 집계 연산은 전체 데이터를 스캔하기 때문에, WHERE로 먼저 조건을 좁히는 것이 중요하다
'컴퓨터공학' 카테고리의 다른 글
SQL JOIN 완전 정복: 테이블을 연결하는 진짜 기술 (0) | 2025.04.03 |
---|---|
SQL 조건문 완전 정복: WHERE, LIKE, IN, BETWEEN, IS NULL, 비교연산자 (0) | 2025.03.29 |
SQL 문법 기초 정복: SELECT부터 DELETE까지 완전 정리 (0) | 2025.03.29 |
고급 정규형 정리: BCNF, 4NF, 5NF를 완전히 이해하자 (0) | 2025.03.28 |
정규화란 무엇인가? 데이터 구조를 정제하는 방법 (0) | 2025.03.28 |