코딩 스쿨 SQL

언어선택 : HTMLCSSJAVAJAVASCRIPTMYSQLSQL PHP

SQL Having

SQL HAVING: 그룹화된 데이터에 조건을 적용

SQL HAVING 절은 GROUP BY 절과 함께 사용되어, 그룹화된 결과에 조건을 적용할 때 사용됩니다. HAVINGWHERE 절과 유사하지만, 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 절에서도 ANDOR 연산자를 사용하여 여러 조건을 결합할 수 있습니다.

예제: 직원 수가 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의 성능 고려

HAVINGGROUP BY 이후에 데이터를 필터링하기 때문에, 많은 데이터를 처리할 경우 성능에 영향을 미칠 수 있습니다. 가능한 경우 WHERE 절을 먼저 사용하여 데이터를 미리 필터링한 후 GROUP BYHAVING을 적용하는 것이 좋습니다.

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 BYHAVING을 사용하는 것이 좋습니다.

copyright ⓒ 스타트코딩 all rights reserved.
이메일 : startcodingim@gamil.com