PostgreSQL - HAVING 절: 초보자를 위한 친절한 가이드
안녕하세요, 데이터베이스 열정가 되고자 하는 여러분! 오늘 우리는 PostgreSQL의 흥미로운 주제로 HAVING 절에 대해 다룰 예정입니다. 프로그래밍에 처음이라면 걱정하지 마세요; 저는 이 개념을 단계별로 안내해 드릴 것이니, 마음껏 즐겨 주세요. 여러분의 favorite beverage를 한 잔 챙겨서, 이 학습 여정에 함께 동행해 주세요!
HAVING 절이란?
들어가기 전에 HAVING 절이 무엇인지 이해해 보겠습니다. 큰 파티(데이터베이스)를 준비하고, 손님들(데이터)을 그들의 좋아하는 색상(GROUP BY)에 따라 그룹화하려고 합시다. 그런데 색상 그룹 중 5명 이상인 그룹에만 집중하고 싶다면 어떻게 하죠? 이때 HAVING 절이 유용하게 쓰입니다!
PostgreSQL에서 HAVING 절은 특정 조건에 따라 그룹화된 데이터를 필터링할 수 있게 해줍니다. 마치 파티의 보디가드처럼, 당신의 기준에 맞는 그룹만 남겨둡니다.
HAVING 절의 문법
HAVING 절의 기본 문법을 살펴보겠습니다:
SELECT column1, column2, ..., aggregate_function(column)
FROM table_name
GROUP BY column1, column2, ...
HAVING condition;
각 부분의 의미는 다음과 같습니다:
-
SELECT
: 가져올 컬럼을 지정합니다. -
aggregate_function
: COUNT(), SUM(), AVG() 등과 같은 함수입니다. -
FROM
: 쿼리를 수행할 테이블을 지정합니다. -
GROUP BY
: 결과를 하나 이상의 컬럼으로 그룹화합니다. -
HAVING
: 그룹화된 결과를 조건에 따라 필터링합니다.
이제 몇 가지 예제를 통해 이를 실제로 확인해 보겠습니다!
예제 1: 기본 HAVING 절
가정해 보겠습니다. employees
라는 테이블이 있고, 그 컬럼으로 id
, name
, department
, salary
가 있습니다. 평균 연봉이 $50,000 이상인 부서를 찾아보겠습니다.
SELECT department, AVG(salary) as avg_salary
FROM employees
GROUP BY department
HAVING AVG(salary) > 50000;
이 쿼리는 다음과 같은 작업을 수행합니다:
- 부서별로 직원을 그룹화합니다.
- 각 부서의 평균 연봉을 계산합니다.
- 평균 연봉이 $50,000 이상인 부서만 표시합니다.
예제 2: HAVING과 COUNT
이제 부서에 5명 이상의 직원이 있는 부서를 찾아보겠습니다:
SELECT department, COUNT(*) as employee_count
FROM employees
GROUP BY department
HAVING COUNT(*) > 5;
이 작업은 다음과 같습니다:
- 부서별로 직원을 그룹화합니다.
- 각 부서의 직원 수를 계산합니다.
- 5명 이상의 직원이 있는 부서만 표시합니다.
예제 3: WHERE과 HAVING을 결합
이제 좀 더 복잡한 예제를 보겠습니다. 평균 연봉이 $60,000 이상인 부서를 찾지만, 2010년 이후에 고용된 직원만 고려합니다:
SELECT department, AVG(salary) as avg_salary
FROM employees
WHERE hire_date > '2010-01-01'
GROUP BY department
HAVING AVG(salary) > 60000;
이 쿼리는 다음과 같은 작업을 수행합니다:
- 2010년 이후에 고용된 직원을 필터링합니다.
- 남은 직원을 부서별로 그룹화합니다.
- 각 그룹의 평균 연봉을 계산합니다.
- 평균 연봉이 $60,000 이상인 부서만 표시합니다.
WHERE과 HAVING의 차이
이제 WHERE과 HAVING을 모두 사용할 수 있잖아요? WHERE과 HAVING을 구분하는 간단한 방법을 알려드리겠습니다:
- WHERE는 그룹화되기 전에 개별 로우를 필터링합니다.
- HAVING은 그룹화된 후에 그룹을 필터링합니다.
이를 마치 보디가드가 문을 열 때 ID를 확인하고, 그룹이 형성된 후에 그룹의 행동을 확인하여 남겨둘 그룹을 결정하는 것과 같이 생각할 수 있습니다.
HAVING과 함께 사용할 수 있는 일반 집계 함수
HAVING과 함께 사용할 수 있는 일반 집계 함수의 표를 제공합니다:
함수 | 설명 | 예제 |
---|---|---|
COUNT() | 로우 수를 계산합니다 | HAVING COUNT(*) > 5 |
SUM() | 값의 합을 계산합니다 | HAVING SUM(salary) > 100000 |
AVG() | 값의 평균을 계산합니다 | HAVING AVG(age) < 30 |
MAX() | 최대 값을 찾습니다 | HAVING MAX(price) < 1000 |
MIN() | 최소 값을 찾습니다 | HAVING MIN(rating) > 3 |
실습 문제: 파티 계획!
이제 우리가 이전에 이야기한 파티를 계획해 보겠습니다. guests
테이블이 있고, name
, age
, favorite_color
, bringing_snacks
컬럼이 있습니다.
-- 색상별로 3명 이상의 손님을 초대하고 평균 연령이 25세 이상인 그룹을 찾습니다
SELECT favorite_color, COUNT(*) as guest_count, AVG(age) as avg_age
FROM guests
GROUP BY favorite_color
HAVING COUNT(*) > 3 AND AVG(age) > 25;
-- 50% 이상의 손님들이 간식을 가져오는 색상 그룹을 찾습니다
SELECT favorite_color,
COUNT(*) as total_guests,
SUM(CASE WHEN bringing_snacks THEN 1 ELSE 0 END) as snack_bringers
FROM guests
GROUP BY favorite_color
HAVING SUM(CASE WHEN bringing_snacks THEN 1 ELSE 0 END) > COUNT(*) / 2;
이 쿼리에서 우리는 HAVING을 사용하여 파티 그룹이 특정 기준을 충족하는지 확인하고 있습니다. 마치 각 색상 그룹이 충분한 인원수를 가지고 간식을 가져오는지 확인하는 것과 같습니다!
결론
축하합니다! 지금까지 HAVING 절의 첫 걸음을 냈어요. HAVING은 그룹화된 데이터를 필터링할 때 친구가 됩니다. 마치 파티의 스마트 어시스턴트처럼, 그룹이 형성된 후에 분석해줍니다.
PostgreSQL의 여정을 계속하면서, HAVING 절이 데이터 분석과 보고에 매우 유용하게 쓰일 것을 발견할 것입니다. 계속 연습하면 곧 그룹화와 필터링을 마스터할 수 있을 것입니다!
행복한 쿼리 작성과, 항상 정리된 데이터베이스와 최적화된 쿼리를 기원합니다!
Credits: Image by storyset