SQL Having
SQL HAVING: 그룹화된 데이터에 조건을 적용
SQL HAVING 절은 GROUP BY 절과 함께 사용되어, 그룹화된 결과에 조건을 적용할 때 사용됩니다. HAVING은 WHERE 절과 유사하지만, WHERE는 개별 행에 조건을 걸고, HAVING은 그룹화된 결과에 대해 조건을 설정합니다. 주로 집계 함수 결과에 조건을 걸 때 유용하게 사용됩니다.
1. 기본 HAVING 문법
SELECT 열이름, 집계함수(열이름)
FROM 테이블이름
GROUP BY 열이름
HAVING 조건;
- GROUP BY: 데이터를 그룹화할 기준이 되는 열.
- 집계 함수: COUNT(), SUM(), AVG(), MAX(), MIN()과 같은 집계 함수.
- HAVING 조건: 그룹화된 결과에 적용할 조건.
2. SQL HAVING 예제
2.1 부서별 직원 수가 3명 이상인 부서 조회
다음은 employees
테이블에서 부서별 직원 수가 3명 이상인 부서를 조회하는 예제입니다.
SELECT department, COUNT(*) AS employee_count
FROM employees
GROUP BY department
HAVING COUNT(*) >= 3;
이 쿼리는 각 부서의 직원 수를 그룹화하고, 직원 수가 3명 이상인 부서만 반환합니다.
결과 예시:
department | employee_count |
---|---|
Sales | 3 |
Engineering | 4 |
2.2 부서별 평균 급여가 5000 이상인 부서 조회
SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department
HAVING AVG(salary) >= 5000;
이 쿼리는 평균 급여가 5000 이상인 부서를 조회합니다.
결과 예시:
department | avg_salary |
---|---|
Sales | 5000 |
Engineering | 6000 |
3. HAVING과 WHERE 절의 차이
- WHERE: 개별 행에 조건을 적용합니다. GROUP BY가 실행되기 전에 데이터를 필터링합니다.
- HAVING: 그룹화된 결과에 조건을 적용합니다. GROUP BY가 실행된 후에 데이터를 필터링합니다.
예제: WHERE와 HAVING을 함께 사용
다음은 급여가 3000 이상인 직원들에 대해서만 부서별로 직원 수가 2명 이상인 부서를 조회하는 예제입니다.
SELECT department, COUNT(*) AS employee_count
FROM employees
WHERE salary >= 3000
GROUP BY department
HAVING COUNT(*) >= 2;
이 쿼리는 WHERE로 먼저 급여가 3000 이상인 직원들만 필터링한 후, HAVING으로 직원 수가 2명 이상인 부서만 반환합니다.
결과 예시:
department | employee_count |
---|---|
Sales | 3 |
Engineering | 4 |
4. 여러 조건을 결합한 HAVING
HAVING 절에서도 AND 및 OR 연산자를 사용하여 여러 조건을 결합할 수 있습니다.
예제: 직원 수가 2명 이상이고, 평균 급여가 5000 이상인 부서 조회
SELECT department, COUNT(*) AS employee_count, AVG(salary) AS avg_salary
FROM employees
GROUP BY department
HAVING COUNT(*) >= 2 AND AVG(salary) >= 5000;
이 쿼리는 직원 수가 2명 이상이고 평균 급여가 5000 이상인 부서를 조회합니다.
결과 예시:
department | employee_count | avg_salary |
---|---|---|
Sales | 3 | 5000 |
Engineering | 4 | 6000 |
5. HAVING과 집계 함수 결합
HAVING 절은 주로 집계 함수와 결합하여 특정 조건에 맞는 그룹화된 데이터를 필터링합니다. 일반적으로 COUNT(), SUM(), AVG(), MAX(), MIN() 같은 함수와 함께 사용됩니다.
예제: 부서별 최대 급여가 6000 이상인 부서 조회
SELECT department, MAX(salary) AS max_salary
FROM employees
GROUP BY department
HAVING MAX(salary) >= 6000;
이 쿼리는 부서별 최대 급여가 6000 이상인 부서만 반환합니다.
결과 예시:
department | max_salary |
---|---|
Engineering | 7000 |
HR | 6000 |
6. GROUP BY와 HAVING의 성능 고려
HAVING은 GROUP BY 이후에 데이터를 필터링하기 때문에, 많은 데이터를 처리할 경우 성능에 영향을 미칠 수 있습니다. 가능한 경우 WHERE 절을 먼저 사용하여 데이터를 미리 필터링한 후 GROUP BY와 HAVING을 적용하는 것이 좋습니다.
7. 실전 예제
예제 1: 부서별 직원 수가 2명 이상인 부서 조회
SELECT department, COUNT(*) AS employee_count
FROM employees
GROUP BY department
HAVING COUNT(*) >= 2;
예제 2: 부서별로 평균 급여가 5000 이상인 부서 조회
SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department
HAVING AVG(salary) >= 5000;
예제 3: 직원 수가 3명 이상이고, 총 급여 합계가 20000 이상인 부서 조회
SELECT department, COUNT(*) AS employee_count, SUM(salary) AS total_salary
FROM employees
GROUP BY department
HAVING COUNT(*) >= 3 AND SUM(salary) >= 20000;
8. 요약
- SQL HAVING 절은 GROUP BY로 그룹화된 결과에 조건을 적용하는 데 사용됩니다.
- WHERE 절과 달리, 집계 함수와 함께 사용하여 그룹화된 데이터를 필터링할 수 있습니다.
- HAVING은 집계된 결과를 필터링할 때 매우 유용하며, COUNT(), SUM(), AVG(), MAX(), MIN() 같은 집계 함수와 결합하여 데이터를 분석할 수 있습니다.
- 성능을 고려해, 먼저 WHERE로 데이터를 필터링한 후 GROUP BY와 HAVING을 사용하는 것이 좋습니다.