카테고리 없음

[SQL] 데이터의 그룹 제한 : HAVING 절

박쓸개 2024. 5. 8. 09:45

###HAVING

그룹 결과 제한 -  그룹을 필터링

HAVING + 조건식을 사용 

GROUP BY표현식을 HAVING 절 조건식에 사용하는것은 비효율 적이고 WHERE을 사용하는게 효율적.

 

그룹 함수를 HAVING 절 조건식에 사용해야 의미 있음
그룹 함수로 그룹 결과를 구하고 그 결과를 이용하여 해당 그룹 필터링
① GROUP BY 절에 의해 행이 소그룹화됨
② HAVING 절의 그룹 함수가 각 그룹에 적용됨
③ HAVING 절의 조건을 만족하는 그룹만 SELECT 절로 통과

 

❓ WHERE과 HAVING의 차이 
WHERE절은 행을제한, 개별행에 대한 조건지정,

HAVING 절은 집계함수를 사용하여 그룹을 제한, 그룹화된 데이터에 조건지정

HERE 절은 쿼리의 시작 부분, HAVING 절은 GROUP BY 절 뒤에

SELECT department_id, SUM(salary), COUNT(salary)
FROM employees
WHERE department_id IN (30, 50, 70)
GROUP BY department_id
HAVING COUNT(salary) >= 3 -- 집계 함수COUNT를 기반으로 한 그룹화된 결과에 대한 조건을 지정
--그룸함수를 사용하지않을거면 WHERE을 사용하는게 낫다

 

 

###그룹함수중첩

--그룹함수 중첩
SELECT MAX(AVG(salary))--평균 급여를 계산한 후, 그 중에서 최대 평균급여를
FROM employees
GROUP BY department_id; --부서별로 묶음

--안되는 쿼리
SELECT department_id, MAX(AVG(salary)) 
--부서별로 그룹을 만들었을때는 행이 10건이상, MAX(AVG)는 전체하나의 행이기때문
FROM employees
GROUP BY department_id; --부서 ID로 그룹을 만들었고

그룹 함수 중첩의 깊이: 2 단계까지만,, 
그룹 함수를 한 번만 중첩해도 결과는 항상 한 건이기 때문에

그룹 함수를 중첩하려면 반드시 GROUP BY 절 필요


 내부 그룹 함수의 결과가 여러 건이어야 하므로 소그룹의 결과(즉, 내부 그룹 함수의 결과)에 대해 그룹 함수를 적용
 그룹 함수를 중첩하면 GROUP BY 절의 표현식을 select-list에 기술할 수 없다
 소그룹의 결과가 새로운 전체 집합이 되고 새로운 전체 집합에 대해 GROUP BY 절을 다시 설정할 수 없기 때문.

 

SELECT 문에서 집합의 흐름