SQL

[SQL] GROUP BY 절, HAVING 절

beginner-in-coding 2025. 2. 14. 08:56

01. GROUP BY

  • 각 행을 특정 조건에 따라 그룹으로 분리하여 계산하도록 하는 구문식
  • 그룹으로 지정할 컬럼을 전달
    • 여러개 전달 가능
  • 만약 그룹 연산에서 제외할 대상이 존재 → 미리 WHERE 절에서 해당 행을 제외
    • 수행 순서: WHERE GROUP BY
  • 그룹에 대한 조건은 WHERE절에서 정의하지 않음 HAVING절에서 정의
  • SELECT 절에 집계 함수를 사용하여 그룹 연산 결과 표현
  • GROUP BY 절을 사용하면 데이터 요약  요약되기 전 데이터와 함께 출력할 수 없음
SELECT * | 컬럼명 | 표현식
FROM 테이블명 또는 뷰명
WHERE 조회할 데이터 조건
GROUP BY 그룹핑컬럼명
HAVING 그룹핑 대상 필터링 조건;
SELECT grade, AVG(age), name
FROM university
GROUP BY grade;  --잘못된 GROUP BY 사용법
  •  grade가 같은 값끼리 묶여서 요약 정보만 SELECT절에 표현 가능 → 따라서 GROUP BY 컬럼, 집계 함수를 사용한 결과만 전달 가능
  • 따라서 위의 예제 같은 경우에서 name은 요약할 수 없으므로 에러남

02. HAVING 절

  • 사용: 그룹 함수 결과를 조건으로 사용할 때
  • WHERE절을 사용하여 그룹을 제한할 수 없으므로 HAVING 절에 전달
  • HAVING절은 GROUP BY 절 뒤에 오게 작성하는 것을 권장
  • 내부적인 연산 순서가 SELECT보다 먼저   SELECT 절에서 선언된 Alias 사용 불가
SELECT grade, AVG(age)
FROM university
WHERE AVG(age) > 23  --WHERE절에서는 그룹핑을 통한 그룹함수 사용을 할 수 없음
GROUP BY grade;  --그룹함수 조건을 WHERE절에 전달하는 경우 에러 발생
SELECT grade, AVG(age)
FROM university
GROUP BY grade;
HAVING AVG(grade) > 23;  --그룹함수 조건을 HAVING절에 전달
SELECT grade, AVG(age)
FROM university
WHERE grade IN (2,3)  --grade가 2학년, 3학년인 경우에만 그룹핑
GROUP BY grade
HAVING AVG(age) > 23;  --WHERE절과 HAVING절 동시 사용, grade로 그룹핑 된 age 평균이 23인 경우만 출력

 

  • 순서상 WHERE절을 먼저 수행
    1. 원하는 데이터만 필터링
    2. GROUP BY에 의해 그룹 연산을 수행
    3. HAVING 절에서 만족하는 데이터만 선택해서 출력

'SQL' 카테고리의 다른 글

[SQL] JOIN (1)  (0) 2025.02.14
[SQL] ORDER BY 절  (0) 2025.02.14
[SQL] WHERE 절  (0) 2025.02.13
[SQL] SQL 함수  (1) 2025.02.13
[SQL] DQL (Data Query Language)  (0) 2025.02.13