반응형
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 이상인 부서만 남김
✅ 결과 순서
- WHERE가 먼저 실행되어 개별 행 필터링
- GROUP BY로 데이터를 그룹화
- HAVING으로 그룹화된 데이터 필터링
🔹 마무리
📌 핵심 정리
✔ WHERE: 개별 행을 필터링 (집계 함수 사용 불가)
✔ HAVING: 그룹화된 데이터 필터링 (집계 함수 사용 가능)
✔ 두 개를 함께 사용하면 더 정교한 조건 설정 가능
SQL 실습을 통해 HAVING과 WHERE을 직접 사용해 보세요! 😊
반응형
'개발 > SQL' 카테고리의 다른 글
서브쿼리(Subquery) 활용법: EXISTS, IN, ANY, ALL (6) | 2025.03.17 |
---|---|
JOIN 종류 정리: INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN 비교 (0) | 2025.03.16 |
WHERE 절 & 조건문 활용: BETWEEN, IN, LIKE, IS NULL 등 (0) | 2025.03.07 |
DML과 DDL 차이점: SELECT, INSERT, UPDATE, DELETE vs CREATE, ALTER, DROP (0) | 2025.03.06 |
SQL 개요: 관계형 데이터베이스와 SQL의 기본 개념 (0) | 2025.03.05 |