[SQL] Oracle에서 GROUP BY 절과 HAVING

GROUP BY는 단어 그대로 특정 속성을 기준으로 그룹화하는 절이다. 하나의 속성으로 그룹화할 수도 있고, 여러 속성으로 그룹화할 수도 있다.
Hi's avatar
Aug 07, 2024
[SQL] Oracle에서 GROUP BY 절과 HAVING

💡
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
SELECT문의 논리적 실행 순서
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

soultree