데이터베이스를 다룰 때 단순히 데이터를 조회하는 것뿐만 아니라, 데이터를 집계하여 유의미한 통찰을 얻는 일이 중요합니다. 이때 SQL의 GROUP BY와 HAVING은 데이터를 그룹화하고, 그룹별로 조건을 적용하여 분석하는 데 핵심적인 역할을 합니다. 이번 포스팅에서는 GROUP BY와 HAVING의 개념, 사용법, 그리고 실무 예제를 통해 효과적인 데이터 집계 방법을 알아보겠습니다.
1. GROUP BY란 무엇인가?
GROUP BY는 SELECT 문에서 데이터를 특정 기준으로 그룹화하여, 각 그룹별로 집계 결과를 도출할 수 있게 해주는 절입니다. 집계 함수와 함께 사용되며, 대표적인 집계 함수는 다음과 같습니다:
- COUNT(): 데이터 개수 계산
- SUM(): 값의 합 계산
- AVG(): 평균 계산
- MAX() / MIN(): 최대값 및 최소값 반환
기본 문법:
SELECT column_name, aggregate_function(column_name)
FROM table_name
GROUP BY column_name;
2. HAVING이란 무엇인가?
HAVING은 GROUP BY 절과 함께 사용되며, 그룹화된 데이터에 조건을 적용합니다. WHERE 절이 개별 행에 조건을 적용하는 데 반해, HAVING은 그룹 전체에 조건을 적용합니다.
기본 문법:
SELECT column_name, aggregate_function(column_name)
FROM table_name
GROUP BY column_name
HAVING condition;
3. GROUP BY와 HAVING의 기본 사용법
예제 1: 그룹별 총합 계산
판매 데이터를 분석하여 각 제품의 총 판매량을 구해 보겠습니다.
SELECT product_id, SUM(sales) AS total_sales
FROM sales_data
GROUP BY product_id;
이 쿼리는 각 product_id별로 판매량(sales)을 합산하여 total_sales라는 별칭으로 반환합니다.
예제 2: 그룹별 조건 적용하기 (HAVING 사용)
전체 판매량이 1000 이상인 제품만 조회하려면 HAVING 절을 사용합니다.
SELECT product_id, SUM(sales) AS total_sales
FROM sales_data
GROUP BY product_id
HAVING SUM(sales) >= 1000;
HAVING 절은 그룹별 집계 결과(SUM(sales))를 기준으로 조건을 필터링합니다.
4. GROUP BY와 HAVING의 실무 활용 예제
예제 3: 고객별 평균 주문 금액 구하기
고객별로 주문의 평균 금액을 계산한 뒤, 평균 금액이 500 이상인 고객만 조회하는 예제입니다.
SELECT customer_id, AVG(order_amount) AS avg_order
FROM orders
GROUP BY customer_id
HAVING AVG(order_amount) >= 500;
이 쿼리는 customer_id를 기준으로 그룹화한 뒤, 각 고객의 평균 주문 금액(AVG(order_amount))이 500 이상인 그룹만 반환합니다.
예제 4: 도시별 주문 건수 분석
특정 기간 동안 도시별로 발생한 주문 건수를 계산하고, 주문 건수가 50건 이상인 도시만 필터링합니다.
SELECT city, COUNT(*) AS order_count
FROM orders
WHERE order_date BETWEEN '2024-01-01' AND '2024-12-31'
GROUP BY city
HAVING COUNT(*) >= 50;
이 쿼리는 city를 기준으로 그룹화하고, 주문 건수가 50건 이상인 도시를 반환합니다.
예제 5: 카테고리별 최고 매출 제품 분석
각 카테고리에서 매출이 가장 높은 제품의 정보를 가져오는 예제입니다.
SELECT category_id, product_id, MAX(sales) AS max_sales
FROM products
GROUP BY category_id, product_id
HAVING MAX(sales) > 10000;
여기서는 category_id와 product_id로 그룹화한 뒤, 매출(sales)이 10,000 이상인 그룹을 필터링합니다.
5. GROUP BY와 HAVING 사용 시 주의사항
- SELECT 문과 GROUP BY의 컬럼 일치
GROUP BY에서 지정하지 않은 컬럼은 SELECT 절에 사용할 수 없습니다. 예외적으로 집계 함수로 묶인 컬럼만 허용됩니다. - -- 오류 발생 SELECT product_id, sales FROM sales_data GROUP BY product_id;
- HAVING과 WHERE의 차이점
WHERE는 GROUP BY 이전에 데이터 행에 필터를 적용하고, HAVING은 GROUP BY 이후에 그룹에 필터를 적용합니다. - SELECT product_id, SUM(sales) FROM sales_data WHERE sales > 100 -- 각 행에 조건 적용 GROUP BY product_id HAVING SUM(sales) > 1000; -- 그룹에 조건 적용
- 성능 최적화
HAVING 절은 GROUP BY 후에 조건을 적용하므로, 데이터 양이 많을수록 성능 저하가 발생할 수 있습니다. 가능하면 WHERE 절로 데이터를 먼저 필터링하는 것이 좋습니다.
6. 결론
GROUP BY와 HAVING은 데이터를 그룹화하고 필터링하여 유의미한 정보를 도출하는 데 매우 유용한 도구입니다. 실무에서 이 두 절을 적절히 활용하면 데이터 분석의 효율성과 정확성을 높일 수 있습니다. 이 글에서 소개한 예제를 바탕으로 데이터 집계 쿼리를 작성하며, 데이터베이스 분석에 한 걸음 더 다가가 보세요!
'Database' 카테고리의 다른 글
오라클 DB에서 JOIN 개념 이해하기: INNER JOIN과 OUTER JOIN (0) | 2024.12.03 |
---|---|
오라클 집계 함수: COUNT, SUM, AVG (0) | 2024.12.03 |
오라클 CASE와 DECODE로 조건 처리하기 (0) | 2024.12.03 |
오라클 날짜 함수: SYSDATE, ADD_MONTHS, MONTHS_BETWEEN (0) | 2024.12.03 |
오라클 문자열 함수의 핵심 이해: CONCAT, SUBSTR, INSTR (0) | 2024.12.03 |