PostgreSQL - HAVING 절: 초보자를 위한 친절한 가이드

안녕하세요, 데이터베이스 열정가 되고자 하는 여러분! 오늘 우리는 PostgreSQL의 흥미로운 주제로 HAVING 절에 대해 다룰 예정입니다. 프로그래밍에 처음이라면 걱정하지 마세요; 저는 이 개념을 단계별로 안내해 드릴 것이니, 마음껏 즐겨 주세요. 여러분의 favorite beverage를 한 잔 챙겨서, 이 학습 여정에 함께 동행해 주세요!

PostgreSQL - Having Clause

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;

각 부분의 의미는 다음과 같습니다:

  1. SELECT: 가져올 컬럼을 지정합니다.
  2. aggregate_function: COUNT(), SUM(), AVG() 등과 같은 함수입니다.
  3. FROM: 쿼리를 수행할 테이블을 지정합니다.
  4. GROUP BY: 결과를 하나 이상의 컬럼으로 그룹화합니다.
  5. 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;

이 쿼리는 다음과 같은 작업을 수행합니다:

  1. 부서별로 직원을 그룹화합니다.
  2. 각 부서의 평균 연봉을 계산합니다.
  3. 평균 연봉이 $50,000 이상인 부서만 표시합니다.

예제 2: HAVING과 COUNT

이제 부서에 5명 이상의 직원이 있는 부서를 찾아보겠습니다:

SELECT department, COUNT(*) as employee_count
FROM employees
GROUP BY department
HAVING COUNT(*) > 5;

이 작업은 다음과 같습니다:

  1. 부서별로 직원을 그룹화합니다.
  2. 각 부서의 직원 수를 계산합니다.
  3. 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;

이 쿼리는 다음과 같은 작업을 수행합니다:

  1. 2010년 이후에 고용된 직원을 필터링합니다.
  2. 남은 직원을 부서별로 그룹화합니다.
  3. 각 그룹의 평균 연봉을 계산합니다.
  4. 평균 연봉이 $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