Category/SQL

GROUP BY 개념 정리

Corinee 2025. 2. 20. 16:39
728x90

GROUP BY란?

GROUP BY는 같은 값을 가진 행들을 하나의 그룹으로 묶는 역할을 합니다. GROUP BY가 적용되면 각 그룹마다 하나의 결과만 반환해야 하므로, SELECT에서 그룹 내부에서 어떤 값을 선택할지 명확하게 지정해야 합니다.

🔹 1. GROUP BY를 하면 그룹별로 한 줄만 반환됨

🔥 예제 1: GROUP BY 없이 모든 데이터 조회

SELECT FISH_TYPE, LENGTH
FROM FISH_INFO;

                                   

 FISH_TYPE                                               LENGTH

상어 250
상어 200
참치 180
참치 160
연어 150
연어 120

👉 GROUP BY를 사용하지 않았으므로, 모든 데이터가 개별적으로 출력됩니다.

 

🔥 예제 2: GROUP BY를 사용하면?

SELECT FISH_TYPE, MAX(LENGTH)
FROM FISH_INFO
GROUP BY FISH_TYPE;

                                 

FISH_TYPE                                                MAX(LENGTH)

상어 250
참치 180
연어 150

👉 FISH_TYPE별로 그룹을 만들었고, 각 그룹에서 최대값(MAX(LENGTH))만 선택됩니다.

  • GROUP BY를 하면 같은 FISH_TYPE을 가진 행들은 한 그룹으로 묶이고,
  • SELECT에서 MAX(LENGTH) 같은 집계 함수(aggregation function, 예: MAX, MIN, SUM, AVG, COUNT)를 사용해야 합니다.
728x90

🔹 2. GROUP BY를 하면 SELECT에서 그룹 내부 조건을 지정해야 함

잘못된 예제: GROUP BY를 했는데 일반 컬럼을 그냥 SELECT함

SELECT FISH_TYPE, LENGTH  -- LENGTH는 그룹별로 여러 개 존재하는데 하나만 선택됨
FROM FISH_INFO
GROUP BY FISH_TYPE;

💥 오류 발생 가능!

  • LENGTH는 GROUP BY에 포함되지 않음 → 어느 값을 선택할지 애매하기 때문에 SQL이 오류를 발생시킬 수도 있음.
  • MySQL에서는 임의의 값을 선택할 수도 있음 → 비일관적인 결과 가능성 있음.

올바른 예제: MAX(LENGTH)와 함께 서브쿼리 사용

WITH MAX_SIZE AS (
    SELECT FISH_TYPE, MAX(LENGTH) AS MAX_LENGTH
    FROM FISH_INFO
    GROUP BY FISH_TYPE
)
SELECT I.ID, N.FISH_NAME, I.LENGTH
FROM FISH_INFO I
JOIN MAX_SIZE M
    ON I.FISH_TYPE = M.FISH_TYPE AND I.LENGTH = M.MAX_LENGTH
JOIN FISH_NAME_INFO N
    ON I.FISH_TYPE = N.FISH_TYPE
ORDER BY I.ID;

🔹 설명:

  1. MAX_SIZE에서는 FISH_TYPE별 최대 길이 (MAX(LENGTH))를 찾음.
  2. FISH_INFO 테이블과 JOIN하여 최대 길이를 가진 행만 필터링.
  3. FISH_NAME_INFO를 추가로 JOIN하여 물고기 이름 가져옴.

🔹 3. HAVING을 사용하여 그룹 내부 조건을 걸 수 있음

WHERE는 GROUP BY 적용 전에 실행되지만,
HAVING은 그룹을 만든 이후 그룹 내부에서 조건을 적용하는 역할을 함.

🎯 예제 3: HAVING으로 조건 걸기

SELECT FISH_TYPE, MAX(LENGTH) AS MAX_LENGTH
FROM FISH_INFO
GROUP BY FISH_TYPE
HAVING MAX_LENGTH > 150;

설명:

  • GROUP BY로 FISH_TYPE별 최대 LENGTH를 찾음.
  • HAVING을 사용해서 최대 길이가 150보다 큰 그룹만 선택.

: GROUP BY 사용 시 SELECT와 조건 적용 방법

GROUP BY 없이 SELECT 모든 데이터 개별 조회
GROUP BY + 집계 함수(MAX, SUM, AVG 등) 그룹별로 특정 값을 선택
GROUP BY + HAVING 그룹 내부에서 조건 필터링
WHERE + GROUP BY GROUP BY 전에 데이터를 먼저 필터링
WITH(CTE) + JOIN 그룹별 최대/최소 값을 찾고, 원본 테이블과 조인

🎯 한 문장으로 정리

GROUP BY를 하면 해당 그룹에서 하나의 결과만 나와야 하므로, SELECT에서 일반 컬럼을 그대로 쓰면 안 되고,

집계 함수(MAX, SUM, COUNT 등)로 값을 선택하거나, HAVING을 사용하여 그룹 내부 조건을 지정해야 합니다. 

 

728x90