개발/SQL

HAVING과 WHERE 차이: 그룹 함수와 함께 쓰이는 HAVING의 활용

예니03 2025. 3. 15. 10:22
반응형

SQL을 배울 때 WHERE과 HAVING의 차이점이 헷갈리는 경우가 많습니다.
둘 다 조건을 설정하는 기능을 하지만, 사용하는 위치와 목적이 다릅니다.

✅ 간단 비교:

  • WHERE → 개별 행을 필터링할 때 사용
  • HAVING → GROUP BY로 그룹화된 데이터를 필터링할 때 사용

이번 글에서는 WHERE과 HAVING의 차이점을 이해하고, 실전에서 활용하는 방법을 배워보겠습니다! 😊


🔹 1. WHERE 절 – 개별 행 필터링

WHERE은 테이블에서 개별 행을 필터링하는 데 사용됩니다.
즉, 데이터를 그룹화하기 전에 원하는 조건을 만족하는 행만 가져옵니다.

WHERE 기본 문법

SELECT 열1, 열2, ... FROM 테이블
WHERE 조건;

🔸 예제 1 – 특정 부서의 직원 조회

SELECT name, department, salary FROM employees
WHERE department = 'IT';
  • IT 부서에 속한 직원만 조회

🔸 예제 2 – 급여가 5000 이상인 직원 조회

SELECT name, department, salary FROM employees
WHERE salary >= 5000;
  • 급여(salary)가 5000 이상인 직원만 조회

WHERE 주의점!

  • 개별 행을 기준으로 필터링
  • 집계 함수(COUNT, SUM, AVG 등)와 함께 사용할 수 없음

🔹 2. HAVING 절 – 그룹화된 데이터 필터링

HAVING은 GROUP BY와 함께 사용하며, 그룹화된 데이터의 조건을 설정하는 역할을 합니다.
즉, 집계 함수(COUNT, SUM, AVG, MAX, MIN)를 이용한 결과를 필터링할 때 필요합니다.

HAVING 기본 문법

SELECT 그룹화할_열, 집계함수(열)
FROM 테이블
GROUP BY 그룹화할_열
HAVING 조건;

🔸 예제 1 – 직원이 5명 이상 있는 부서 조회

SELECT department, COUNT(*) AS employee_count
FROM employees
GROUP BY department
HAVING COUNT(*) >= 5;
  • 각 부서(department) 별로 직원 수(COUNT(*))를 계산
  • 직원이 5명 이상인 부서만 조회

🔸 예제 2 – 평균 급여가 6000 이상인 부서 조회

SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department
HAVING AVG(salary) >= 6000;
  • 각 부서의 평균 급여(AVG(salary))를 계산
  • 평균 급여가 6000 이상인 부서만 조회

HAVING 주의점!

  • GROUP BY와 함께 사용해야 함
  • 집계 함수(COUNT, SUM, AVG 등)를 활용한 결과를 필터링할 때 사용

🔹 3. WHERE vs. HAVING 차이 정리

구분 WHERE HAVING
사용 위치 FROM 바로 뒤에 사용 GROUP BY 뒤에 사용
필터링 대상 개별 행 그룹화된 데이터
집계 함수 사용 ❌ 불가능 ✅ 가능
예제 WHERE salary > 5000 HAVING AVG(salary) > 5000

비교 예제 – WHERE vs. HAVING

-- WHERE: 개별 행 필터링
SELECT name, department, salary FROM employees
WHERE salary >= 5000;

-- HAVING: 그룹화된 데이터 필터링
SELECT department, AVG(salary) AS avg_salary FROM employees
GROUP BY department
HAVING AVG(salary) >= 5000;
  • WHERE: 급여가 5000 이상인 개별 직원만 필터링
  • HAVING: 평균 급여가 5000 이상인 부서만 필터링

🔹 4. WHERE와 HAVING 함께 사용하기

평균 급여가 5000 이상인 부서만 조회하되, 계약직(contract) 제외하기

SELECT department, AVG(salary) AS avg_salary
FROM employees
WHERE job_type <> 'contract'  -- 계약직 제외 (개별 행 필터링)
GROUP BY department
HAVING AVG(salary) >= 5000;   -- 평균 급여가 5000 이상인 부서만 조회
  • WHERE job_type <> 'contract' → 계약직 직원은 미리 제외
  • HAVING AVG(salary) >= 5000 → 평균 급여가 5000 이상인 부서만 남김

결과 순서

  1. WHERE가 먼저 실행되어 개별 행 필터링
  2. GROUP BY로 데이터를 그룹화
  3. HAVING으로 그룹화된 데이터 필터링

🔹 마무리

📌 핵심 정리
✔ WHERE: 개별 행을 필터링 (집계 함수 사용 불가)
✔ HAVING: 그룹화된 데이터 필터링 (집계 함수 사용 가능)
두 개를 함께 사용하면 더 정교한 조건 설정 가능

 

SQL 실습을 통해 HAVING과 WHERE을 직접 사용해 보세요! 😊

반응형