[SQL 라이브 세션 - 3회차] SQL 집계함수, 그룹화(GROUP BY/HAVING)

[목차]

1. SQL 집계함수: COUNT, MAX, MIN, SUM, AVG
2. SQL 그룹화: GROUP BY와 HAVING

 

 

 

1. SQL 집계함수

SQL 의 집계함수는 여러 행 또는 열로부터 하나의 결과값을 반환!!!

✔️ 집계함수는 select 문에서 사용

COUNT 테이블의 행 수를 반환
SUM 테이블의 열 합계를 반환
AVG 테이블의 열 평균값을 반환
MIN 테이블의 열 최소값을 반환
MAX 테이블의 열 최대값을 반환

 

💡 예시

# 여러 집계 함수 사용하기(종합)

select count(*) as cnt,         -- 전체 행 수
       avg(나이) as avg_age,     -- 평균 나이
       max(나이) as max_age,     -- 가장 많은 나이
       min(나이) as min_age,     -- 가장 적은 나이
       sum(나이) as sum_age      -- 나이 총합
from basic.theglory;

 

💡 잘못된 예시

# 에러 발생

select *, 
       sum(나이) as sum_age
from basic.theglory;
📌 select * : 모든 행을 그대로 보여줘 ~
📌 sum(나이) : 전체 행의 나이를 합쳐서 1개의 결과만 보여줘~   의 구조 충돌로 에러 발생

 

✔️ 그렇다면 이를 해결하려면? 이라기 보단 이와 같은 문제가 생기지 않으려면!!

SELECT 직업, SUM(나이) AS sum_age
FROM basic.theglory
GROUP BY 직업;

하나의 컬럼을 지정하여 group by 로 그룹화를 해야 한다.  (집계함수만 쓸 때에는 group by 안해도됨)

 

 

 

2. SQL 그룹화 : group by 와 having

✅ group by 

✔️ 특정 컬럼을 기준으로 데이터를 요약해서 비교하고 싶을 때 주로 사용

SELECT 
  기준컬럼,       -- ✅ 예를들어, 성별을 기준으로 / 나이 그룹대를 기준으로 그룹화 등,,,
  집계함수1(조건컬럼) AS 별칭1,그룹화 
  집계함수2(조건컬럼) AS 별칭2
FROM 테이블명
WHERE 조건    -- 선택적으로 사용 가능
GROUP BY 기준컬럼;

 

  • FROM → ON → JOIN → WHERE → GROUP BY → HAVING → SELECT → DISTINCT → ORDER BY
  • GROUP BY는 SQL 실행 순서상 WHERE 다음, SELECT보다 먼저 실행됩니다.
  • 따라서 데이터를 그룹화한 뒤 SELECT가 실행되기 때문에, SELECT 절에는 그룹 기준 컬럼이나 집계 함수로 계산된 값만 쓸 수 있습니다.
  • 그룹 기준에 포함되지 않은 일반 컬럼을 그냥 쓰면, 그 값이 어느 그룹의 데이터인지 명확하지 않아서 에러가 발생합니다.

 

✅ having ( != where 주의 )

✔️ Having 은 group by 에 의한 결과를 필터링 할 때 사용

WHERE GROUP BY 원본 데이터에서 조건을 걸어 미리 필터링
HAVING GROUP BY 집계가 끝난 그룹 결과에 조건을 걸어 필터링

 

💡 예시

SELECT 
  성별,                        -- 기준컬럼
  AVG(나이) AS avg_age
FROM basic.theglory
WHERE 나이 >= 31               -- 원본 데이터에서 31세 이상만 필터링
GROUP BY 성별                  -- 성별 기준으로 그룹화
HAVING AVG(나이) > 41;         -- 그룹화된 결과 중 평균 나이가 41 초과인 그룹만

 

 

 

3. 오늘의 회고

조건을 주는 where 와 having 의 차이를 오늘에서야 명확히 이해할 수 있었다.
오늘 세션에서 서브쿼리 구문도 배웠는데,
스스로 복습해 보고 과제도 진행해 본 후에 내일 정리를 해볼 예정이다.

 

 

끝.