[SQL] Oracle에서 GROUP BY 절과 HAVING
GROUP BY는 단어 그대로 특정 속성을 기준으로 그룹화하는 절이다. 하나의 속성으로 그룹화할 수도 있고, 여러 속성으로 그룹화할 수도 있다.
Aug 07, 2024
GROUP BY
는 단어 그대로 특정 속성을 기준으로 그룹화하는 절이다. 하나의 속성으로 그룹화할 수도 있고, 여러 속성으로 그룹화할 수도 있다.✅ 1. 집계함수
데이터를 그룹화하면, 그룹화된 각 그룹을 집계하는 여러 함수를 사용할 수 있다.
함수 | 의미 |
COUNT(*) | 전체 행의 개수를 반환 |
COUNT(col) | col 값이 NULL이 아닌 개수를 반환 |
COUNT(DISTINCT col) | col 값이 NULL이 아닌 데이터 중, 중복을 제거한 개수를 반환 |
SUM(col) | NULL이 아닌 col의 총합을 반환 |
AVG(col) | NULL이 아닌 col의 평균을 반환 |
MIN(col) | NULL이 아닌 col의 최솟값을 반환 |
MAX(col) | NULL이 아닌 col의 최댓값을 반환 |
✅ 2 GROUP BY 사용 예시
다음은
GROUP BY
절을 사용하여 각 부서(department)별 직원의 수를 계산하는 SQL 예시다.SELECT department, COUNT(*) FROM employees GROUP BY department;
이 예시에서는employees
테이블에서 각 부서별로 직원의 수를 계산하고 있다.
✅ 3. HAVING
GROUP BY를 사용할 때, 조건을 주고 싶을 때 HAVING을 사용한다. WHERE과 비슷하다. 주로 데이터를 그룹화한 후, 특정 그룹을 고를 때 사용한다.
SELECT ... 5 FROM ... 1 WHERE ... 2 GROUP BY ... 3 HAVING ... 4 ORDER BY ... 6
HAVING
절은SELECT
절 전에 수행되기 때문에SELECT
절에 명시되지 않은 집계 함수로도 조건을 부여할 수 있다! 주의할 점은WHERE
절을 사용해도 되는 조건까지HAVING
절에 작성하면 성능이 나빠진다. 왜냐하면,WHERE
절에서 우선적으로 필터링되어야 이후에 수행할 데이터양이 줄어들기 때문이다!GROUP BY
는 비교적 많은 비용이 드는 작업이므로 수행 전에 데이터양을 최소화하는 것이 중요하다.
✅ 4. HAVING 사용 예시
다음은 각 부서별로 직원 수가 10명 이상인 부서를 찾는 SQL 예시다.
SELECT department, COUNT(*) FROM employees GROUP BY department HAVING COUNT(*) >= 10;
이 예시에서는 employees 테이블에서 각 부서별로 직원 수를 계산한 후, 직원 수가 10명 이상인 부서만 필터링하고 있다.
Share article