카테고리 없음
[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 문에서 집합의 흐름